静态库 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
来标记。
1 2 3 4 5 6 7 8 |
|