一、静态库和动态库的区别:
静态库和动态库是相对编译期和运行期的,静态库以 .a 和 .framework 形式存在,链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝;
动态库以 .dylib 和 .framework 形式存在,链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存,一般只能由系统创建。
静态库和动态库的存在形式
静态库: .a 和 .framework
动态库: .dylib 和 .framework
注:项目中如果使用了自制的动态库,不能被上传到 AppStore
静态库分为真机—Debug(调试)版本、真机—Release(发布)版本、模拟器—Debug版本、模拟器—Release版本;开发中一般都打包Release(发布)版本,将真机和模拟器版本合并,提供外界。
二、创建静态库
1、新建项目,点击iOS—Framework&Library—Cocoa Touch Static Library。
系统自动生成以工程名命名的.h和.m文件,可自定义的在目录下添加或删除文件。
注意目录下Products文件夹有一个.a文件为红色,说明文件并不存在。
这里我们将系统生成的.h和.m文件删除。
2、点击Build Phases—Copy Files,左下角点击+号按钮,添加你需要暴露的接口头文件。
如果你在静态库工程中使用了category,那么你可能会碰到链接问题,解决的办法就是需要同时在生成静态 库的工程和使用静态库的工程中使用“-all_load”编译选项,即在对应target的"Build Settings"中的“Other Linker Flags”选项添加“-all_load”。
注意:使用静态库的工程中是一定要加该编译选项的!至于生成静态库的工程中加不加没有试过,不过建议还是加上该编译选项。
3、点击Build Phases左上角的+号按钮,选择New Headers Phase 选择需要暴露出来的 .h 文件
4、查看Build Active architecture only 都改为NO
Yes表示只编译选中模拟器设备对应的架构,
No则为编译所有模拟器设备支持的cup架构
(Debug版本同理)
5、分别在模拟器和真机下Command+B编译一下,Products文件夹下的.a文件变为黑色,表示创建成功,否则失败
6、选中Products文件夹下的.a文件,右击 “Show In Finder” ,查看制作好的 .a 文件
Debug-iphoneos 文件夹里面的东西是用在真机上的
Debug-iphonesimulator 文件夹里面的东西是用在模拟器上的
如果 Scheme 是 Release 模式,生成的文件夹就以 Release 开头
7、.a 文件能同时用在真机和模拟器上,需要进行合并
在终端输入指令: lipo -create 模拟器.a文件的路径 真机.a文件的路径 -output 合并后的保存路径(.a)
例如:lipo -create /Users/xxxx/Library/Developer/Xcode/DerivedData/StaticLib/Build/Products/Release-iphoneos/libxxx.a /Users/xxxx/Library/Developer/Xcode/DerivedData/StaticLib/Build/Products/Release-iphonesimulator/libxxx.a -output /Users/shelin/Desktop/StaticLib.a
8、使用:只需将.a和暴露出来的.h头文件导入工程目录下就可供外界使用。
网友评论