.a 或者 .framework 作为后缀,目前开发者自己创建的库文件(Framework)其实都是以静态库的形式链接到执行文件的。链接时完整的拷贝到了可执行文件中,被多次使用就会有多份拷贝(eg:iOS8+的Extention中使用)。静态库文件一般都会比较大,因为所有要使用的数据都会被编译进去,而且如果库文件的某个函数改变了,那么就又需要重新编译新的库文件了,优点就是编译后的执行程序不需要外部的函数库支持,因为所有的函数都已经被编译进去了。 dylib 或者 .framework 最为后缀,系统为我们提供的framework就是动态库,目前开发者是不允许使用动态库的,因为我们自己创建的库文件虽然 buildSetting 中的 Mach-O Type 设置为 Dynamic Library ,但是使用时直接链接到程序里面的,而不是放在服务器上进行更新,开发者如果使用动态库放在服务器上,然后动态的加载 dlopen 是不会通过审核的,不然Apple的审核就没有意义了。动态库在链接时不复制,程序运行时由系统动态加载到内存,系统只加载一次,多个程序间共用,节省内存,而且升级方便。 我们创建framework库文件时,系统默认是动态库的格式,如果想做成静态库,需要在 buildSetting 中将 Mach-O Type 选项设置为 Static Library 就行了!
.a 静态库的时候需要三个组成部分:.a文件+开放的头文件+资源文件。
Embedded Framework 是 iOS8 引入的为了方便 Extention 和宿主APP公用一份代码库而引入的, Embedded Framework 必须是 Dynamic framework (在buildSeting中设置为Dynamic)。如果你想限制在 Extention 中不可用的API放入你的 Embedded Framework ,你可以勾选 Allow app extension API only 选框。
有些静态库文件我们只是在 DEBUG 模式下,调试使用。而不想打入 release 包中,因为这样会增加安装包的大小,这时可以在 buildSetting 中的 Other Linker Flags 下对应的模式中添加需要的库文件,以 -framework 标记,这样程序编译的时候就会根据里面的标记来编译进执行文件中。
在使用时可以利用 runtime 的反射来判断库文件有没有被加载,或者利用 buildSetting 中的预编译宏 Preprocessor Macros 来标记。
if (NSClassFromString(@"MyFramework") != Nil) {
//MyFramework被加载了
}
//or
#if DEBUG
/*该模式下可使用DEBUG模式下‘Other Linker Flags’
通过‘-framework’引入的静态库*/
#endif