一、静态库与动态库的区别
静态库格式:.a(iOS8之前), .framework(later iOS8)
动态库格式: .tbd(iOS9), .dylib(iOS9之前),.framework
区别:
静态库和动态库是相对编译期和运行期的:静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要改静态库;而动态库在程序编译时并不会被链接到目标代码中,只是在程序运行时才被载入,因为在程序运行期间还需要动态库的存在。
(1).动态库:多个应用程序共享内存中的同一分库文件,节省内存资源,效率相对较高
(2).静态库需要分别导入
注意:上架不能使用除苹果官方意外提供的动态库
二、创建静态库(以创建.framework为后缀的静态库为例)
1.直接创建静态库 File -> New -> Project ->Framework & Library ,
注意:选择Cocoa Touch Static Library 可创建.a后缀的静态库。
- 创建一个类,提供一个方法以及实现。
3.在默认创建的头文件中导入我们新创建的类的头文件,便于我们以后使用该库里面的类时直接导入StaticLibrary.h文件即可。
4.设置需暴露的头文件
工程文件名 -> Targets -> Build Phases -> Headers,将工程中要暴露的头文件拖至Public下:
5.默认编译为动态库,要改为编译成静态库
工程文件名 -> Targets -> Build Settings -> Mach-o Type 改为 Static Library
6.生成静态库
(1)选择64位的模拟器进行编译, 生成模拟器环境下的静态库
(2)选择真机编译,生成真机环境下的静态库
选择Products下的文件,右键Show in Finder进行查看,StaticLibrary.framework即为生成的静态库。
7.选择合适的静态库库导入到工程即可。
注意:(1)在模拟器测试的工程需导入模拟器环境下生成的静态库,在真机上测试的工程需导入真机环境下生成的静态库,不能同时将模拟器环境下生成的与真机环境下生成的相同的静态库导入到同一工程。
(2)若静态库中使用了分类,在导入静态库的时候需要在 工程文件 -> Targets -> Build Settings -> Other Linker Flags 添加-ObjC
8 .合并静态库
我们为了满足导入静态库的工程可同时编译在模拟器环境下以及真机环境下,而不重复的删除与导入模拟器以及真机环境下生成的静态库,我们可以将两种环境生成的静态库进行合并。
打开终端命令工具
- 显示静态库信息
lipo -info
2. 合并静态库
lipo -create 模拟器静态库路径 真机静态库路径 -output
注意:
(1)合并之后的大小基本等于合并之前的静态库大小之和,如果上架只需导入真机环境下生成的静态库。
(2)上文模拟器静态库路径为静态中与库同名的文件的路径,如下图:
- 将合并之后的生成的文件替换.framework中的与库同名的文件。
- 将修改后的.framework库导入到要使用的工程文件中即可使用。
三、在发布环境下生成静态库
上文中生成的静态库是在编译的环境下生成的静态库,我们任然可以在发布的环境下生成静态库。
1.修改编译环境 Edit Scheme -> Run -> Info ->Build Configuration 改为Release
注意:release与debug的区别
(1)debug会保留调试信息,不会优化代码;
(2)release不保留,但是会优化代码,打包出来的文件的代码可能会小于Debug,且运行效率更高
四、向库中添加资源
一般我们静态库中可能会使用一些图片类的资源这时我们需一个设置束,并将图片等资源放入.bundle资源文件中。在使用该静态库时需要将.bundle文件与.framework文件一起导入至工程目录中。
Command + N,选择Resource -> Setting Boundle 创建一个.bundle资源文件。
五、可测试静态库
上述描述的生成静态库方法生成的静态库不能直接运行进行测试,我们需要将其导入另一个工程中才能进行测试。我们可以创建一个直接可用于测试的静态库。
1.commnd + shift + N 创建一个新工程,选择工程文件 -> TARGETS下面的加号,如下图所示:
选择Framework & Library -> Cocoa Touch Framework ,输入库名创建一个库。
创建完成后如下图所示,其余过程与上面生成不可用于测试的静态库一致
注意:
1.如果项目中需要添加动态库,需导入在Targets -> General -> Embedded Binaries下
2.如果打包的静态库使用到了其他的框架,在使用该静态库的工程中,仍然需要导入其他框架
打包成.a为后缀的静态库时,需要把.a的库文件以及相关头文件一起导入工程文件中