iOS 静态库Framework开发(包含静态库,bundle使
静态库和动态库
静态库和动态库是相对编译期和运行期的:静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要该静态库;而动态库在程序编译时并不会被链接到目标代码中,只是在程序运行时才被载入,因为在程序运行期间还需要动态库的存在。
静态库和动态库的存在的形式
静态库:以.a 和 .framework为文件后缀名。
动态库:以.tbd(之前叫.dylib) 和 .framework 为文件后缀名,系统提供的framework都是动态库。
理解:.a 是一个纯二进制文件,.framework 中除了有二进制文件之外还有资源文件。 .a ,要有 .h 文件以及资源文件配合, .framework 文件可以直接使用。总的来说,.a + .h + sourceFile = .framework。所以创建静态库最好还是用.framework的形式
静态库和动态库的区别
静态库在链接时,会被完整的复制到可执行文件中,如果多个App都使用了同一个静态库,那么每个App都会拷贝一份,缺点是浪费内存。类似于定义一个基本变量,使用该基本变量是是新复制了一份数据,而不是原来定义的;
动态库不会复制,只有一份,程序运行时动态加载到内存中,系统只会加载一次,多个程序共用一份,节约了内存。类似于使用变量的内存地址一样,使用的是同一个变量;
共同点:
静态库和动态库都是闭源库,只能拿来满足某个功能的使用,不会暴露内部具体的代码信息。
本篇文章主要讲Framework开发的过程和一些细节
-
新建工程
image.png
-
修改Mach-O Type 选中Static Library (静态库)
image.png
-
修改构建版本为所有版本,否则只会构建当前选中的设备架构
image.png
-
新建TestView
@interface YMTestView : UIView
- (void)changeBackgroundColor:(nonnull UIColor *)bgColor;
@end
@implementation YMTestView
- (void)changeBackgroundColor:(nonnull UIColor *)bgColor {
self.backgroundColor = bgColor;
}
@end
-
将header中需要暴露的头文件由project拖至public
image.png
将所有暴露的头文件导入到自动生成的YMSDK.h文件中方便使用。
-
设置最低支持版本
image.png
-
编译Framework
Edit scheme可修改编译Debug版本或者Release版本
image.png
编译生成的Framework在Products文件夹中,Show In Finder查看
image.png
-
将编译生成的Framework拖入demo中验证
image.png
使用拖拽方式,有一个很大的缺点就是不能进行代码调试,这里推荐一个方法

Add Files to Target, 选择打包Framework项目的.xcodeproj文件 (注意!添加之后需关闭项目,重新打开)

接下来,在demo的build phases中添加对应的Frameworks

如此在运行demo时即可调试Framework项目代码。
关于bundle
-
创建bundle工程
image.png
修改Base SDK ,默认是MacOS, 改为iOS

修改COMBINE_HIDPI_IMAGES 为NO,否则图片格式为TIFF

接下来添加资源文件,一定要选择copy

编译生成的bundle文件在products文件夹中,show finder查看
在demo中导入bundle,使用bundle中资源时需要注意,此时的bundle已经不是mainBundle了,需要获取我们创建的bundle,使用图片,Xib和Storyboard都应通过此法获取

快速创建bundle方式
新建一个文件夹,将需要的资源拖入文件夹,将文件夹重命名为****.bundle,回车确认添加扩展名即可。
将bundle一起打包进Framework
将创建好的bundle拖入framework项目中,并添加target

在使用Framework的demo中使用时需要注意,需要添加copy files


使用时获取bundle方式


为了方便使用,我们可以将获取Bundle添加宏定义或者添加个分类方法。
值得注意的是,当我们打包的Framework中有使用其它Framework或.a静态库是,需要将静态库拷贝到项目,但是不需要添加到Target(否则会报重复文件错误),编译通过即可;而使用我们的Framework时,需要手动导入依赖的静态库到Target,否则会报找不到文件错误。
Framework瘦身方式
-
release模式下设置Generate Debug Symbols 为NO,debug模式设置为YES,大约可以减少30%的体积。这个指标是为了进行代码调试,如果为NO,debug模式将不能进行断点调试。若想具体了解,点击传送门 https://www.jianshu.com/p/11710e7ab661
image.png
-
删除无用代码,设置Dead Code Stripping为YES,去掉冗余代码即代码被定义但未被使用。
-
删除不必的指令集,为了缩小包的体积,可删除armsv7s,因为指令集是向下兼容的,所以设置了armv7是可以在armv7s的设备上运行的,但是执行效率上会有所降低,想详细了解 Architectures,点击跳转 https://www.jianshu.com/p/c76aa6f4a81a