oc-静态库,动态库

开发中,我们经常用到别人写的第三方库。

什么是库?
其实是一段编译好的二进制代码。
当一些代码特别成熟,基本上不怎么需要进行太大改动的时候,我们为了减少编译时间,可以把它们打包成库(或者是为了不想别人看到自己的源码)。
正是因为库是已经编译好的,编译的时候只需要link一下就可以了,所以编译项目的时候不需要等待太长的时间。

link的方式分为两种,静态和动态。

静态链接的方式就是静态库。
静态库(.a文件),在编译的时候会直接拷贝一份到目标程序里。
目标程序外没有依赖,直接就可以运行。缺点是会使得目标应用程序的体积增大。

动态链接的方式就是动态库
动态库(.dylib/.tbd),在编译的时候不会拷贝到目标程序。目标程序只会存储指向动态库的引用。只有当程序运行起来额时候,动态库才会被加载。
动态库不会增加目标程序的体积。同一份动态库在iOS系统里可以被多个程序使用。

Framework

苹果系统平台使用的一种打包方式。将库的二进制文件,头文件和有关资源文件打包在一起。

iOS8.0之前,iOS平台不支持使用动态的Framework。只有苹果自己的Framework是动态库。这种限制可能是出安全的考虑。因为沙盒机制,导致应用程序直接不能共享代码,而动态下载代码又是被禁止的。

iOS8.0之后,苹果添加了动态库的支持。原因可能是为了支持Extension。因为Extension需和app共享代码,但是这种动态库和系统的动态库还是不一样,自己的动态库最后还是需要拷贝到app中的。因此自己制作的动态库又称为Embedded Framework。

swift支持
如果项目中是swift和oc混编,那么项目中如果使用外部的代码,可选方式是有两种:将代码拷贝到工程中和使用动态framework
原因是swift的运行库没有被包含在iOS系统找那个,是会打包到app中(因此swift的app体积会大)。

项目引入的第三方(比如通过Pod管理),编译的时候可以选择编译成静态库和动态库,那么这两种选择最终的包的大小有什么区别?
因为我们项目依赖的第三方虽然是动态库,但是不同于真正意义上的动态库,还是会打入到app里的。而静态库在编译阶段会和主程序包链接在一起,可能做了优化,最终使用静态库的ipa包会比使用动态库的ipa包体积小。

参考链接:https://skyline75489.github.io/post/2015-8-14_ios_static_dynamic_framework_learning.html

你可能感兴趣的:(oc-静态库,动态库)