静态库 VS 动态库
静态库:静态库在Objective-C里面以.a或者.framework作为后缀,目前开发者自己创建的库文件(Framework)其实都是以静态库的形式链接到执行文件的。链接时完整的拷贝到了可执行文件中,被多次使用就会有多份拷贝(eg:iOS8+的Extention中使用)。静态库文件一般都会比较大,因为所有要使用的数据都会被编译进去,而且如果库文件的某个函数改变了,那么就又需要重新编译新的库文件了,优点就是编译后的执行程序不需要外部的函数库支持,因为所有的函数都已经被编译进去了。
动态库:动态库在Objective-C里面以dylib或者.framework最为后缀,系统为我们提供的framework就是动态库,目前开发者是不允许使用动态库的,因为我们自己创建的库文件虽然buildSetting中的Mach-O Type设置为Dynamic Library,但是使用时直接链接到程序里面的,而不是放在服务器上进行更新,开发者如果使用动态库放在服务器上,然后动态的加载dlopen是不会通过审核的,不然Apple的审核就没有意义了。动态库在链接时不复制,程序运行时由系统动态加载到内存,系统只加载一次,多个程序间共用,节省内存,而且升级方便。
我们创建framework库文件时,系统默认是动态库的格式,如果想做成静态库,需要在buildSetting中将Mach-O Type选项设置为Static Library就行了!
framework VS .a
a:.a是纯二进制文件,不能直接拿来使用,需要配合头文件、资源文件一起使用。代码资源、图片、json资源、xib文件等是无法打包进去的,所以使用.a静态库的时候需要三个组成部分:.a文件+开放的头文件+资源文件。
framework:相当于一个文件夹,可以直接拿来使用,所需要的资源、头文件、源文件都在里面。
Static Library/Framework VS Embedded Framework
Embedded Framework是iOS8引入的为了方便Extention和宿主APP公用一份代码库而引入的,Embedded Framework必须是Dynamic framework(在buildSeting中设置为Dynamic)。如果你想限制在Extention中不可用的API放入你的Embedded Framework,你可以勾选Allow app extension API only选框。
-framework的妙用
有些静态库文件我们只是在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
参考文章
http://www.knowstack.com/framework-vs-library-cocoa-ios/
http://stackoverflow.com/questions/27015154/link-binary-with-libraries-vs-embed-frameworks