源代码分为两种
1.开放源码库:开源代码,能看到具体实现
2.不开放源码库:不公开源代码,是经过编译后的二进制文件,看不到具体实现
不开放源码库主要有两种存在形式
1.静态库:.a和.framework(自己制作)
2.动态库:.dylib .tbd和.framework(系统自带)
静态库和动态库在使用上的区别
1.静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝
2.动态库:链接时不复制,程序运行时有系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存
常见问题:
1.iOS里静态库形式?
.a和.framework
2.iOS里动态库形式?
.dylib .tbd和.framework
3.framework为什么既是静态库又是动态库?
系统的.framework是动态库,我们自己建立的.framework是静态库。
4.a与.framework有什么区别?
.a是一个纯二进制文件,.framework中除了有二进制文件之外还有资源文件。
.a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用(.h等资源已经在其内部,图片资源一般再打一个.bundle文件)。
.a + .h + sourceFile = .framework。
建议用.framework.
5.为什么要使用静态库?
方便共享代码实现,便于合理使用。
实现iOS程序的模块化,可以把固定的业务模块化成静态库。
和别人分享你的代码功能实现,但不想让别人看到你代码的实现。
开发第三方sdk的需要。
静态库版本分类
针对运行环境分为两种
1.真机版本 iPhoneos
2.模拟器版本 iPhonesimulator
针对运行模式
调试版本 debug
发布版本 release
制作静态库的注意点
无论是 .a 静态库还是 .framework 静态库,最终需要的都是:二进制文件 + .h + 其它资源文件
.a 本身是一个二进制文件,需要配上 .h 和 其它资源文件 才能使用
.framework 本身已经包含了 .h 和 其它资源文件,可以直接使用
图片资源的处理
如果静态库中用到了图片资源,一般都放到一个bundle文件中,bundle名字一般跟 .a 或 .framework 名字一致
bundle的创建:新建一个文件夹,修改扩展名为 .bundle 即可,右击bundle文件,显示包内容,就可以往bundle文件中放东西
多文件处理
如果静态库需要暴露出来的 .h 比较多,可以考虑创建一个主头文件(一般 主头文件 和 静态库 同名)
在主头文件中包含所有其他需要暴露出来的 .h 文件
使用静态库时,只需要#import 主头文件
静态库中包含了Category
如果静态库中包含了Category,有时候在使用静态库的工程中会报“方法找不到”的错误(unrecognized selector sent to instance)
解决方案:在使用静态库的工程中配置Other Linker Flags为-ObjC
查看静态版本类型
lipo -info lib.a
合并静态版本类型
lipo -create Debug-iphoneos/lib.a Debug-iphonesimulator/lib.a -output lib.a
sdk 开发经历的阶段
(1)xcode 6.0之前,需要自己配置framework的文件创建(xcode)
(2)由于framework在AppStore存在被拒审的风险 我们一般采用 制作.a
(3)现在阶段已经不存在拒审的风险,都是采用framework对外提供功能实现