1.什么是库?
库是程序代码的集合,是共享程序代码的一种方式
2.库的类型
根据源代码的公开情况,库可以分为2种类型:
- 开源库:公开源代码,能看到具体实现 ,比如SDWebImage、AFNetworking
- 闭源库:不公开源代码,是经过编译后的二进制文件,看不到具体实现。
3.什么时候使用库?
一种情况是某些代码需要给别人使用,但是我们不希望别人看到源码,就需要以库的形式进行封装,只暴露出头文件。
另外一种情况是,对于某些不会进行大的改动的代码,我们想减少编译的时间,就可以把它打包成库,因为库是已经编译好的二进制了,编译的时候只需要Link
一下,不会浪费编译时间。
4.动态库、静态库
Link
的方式有两种:静态和动态。根据Link
方式的不同,库可分为静态库和动态库。
4.1 静态库
概念
静态库即静态链接库。链接时会被完整的复制到可执行文件中,被多次使用就有多份拷贝,且这段代码在目标程序里不会再改变。-
存在形式
平台 形式 Windows .lib Linux .a Mac OS/iOS .a / . framework 优点
编译完成之后,库文件实际上就没有作用了。目标程序没有外部依赖,直接就可以运行。缺点
会使用目标程序的体积增大。
4.2 动态库
概念
动态库即动态链接库。与静态库相反,动态库在链接时不复制(目标程序中只会存储指向动态库的引用),程序运行时由系统动态加载到内存,系统只加载一次,多个程序共用(如系统的UIKit.framework等),节省内存。-
存在形式
平台 形式 Windows . dll Linux . so Mac OS/iOS .dylib / .tbd / . framework -
优点
- 不需要拷贝到目标程序中,不会影响目标程序的体积,而且同一份库可以被多个程序使用(因为这个原因,动态库也被称作共享库)。
- 运行时才载入的特性,也可以让我们随时对库进行替换,而不需要重新编译代码。
缺点
动态载入会带来一部分性能损失,使用动态库也会使得程序依赖于外部环境。如果环境缺少动态库或者库的版本不正确,就会导致程序无法运行(Linux 下喜闻乐见的 lib not found 错误)。
5.什么是Framework?
Framework 实际上是一种打包方式,将库的二进制文件,头文件和有关的资源文件打包到一起,方便管理和分发,和静态库动态库的本质没有什么关系。
在 iOS 8 之前,iOS 平台不支持使用动态 Framework,开发者可以使用的 Framework 只有苹果自家的 UIKit.Framework,Foundation.Framework 等。因为 iOS 应用都是运行在沙盒当中,不同的程序之间不能共享代码,同时动态下载代码又是被苹果明令禁止的,没办法发挥出动态库的优势,实际上动态库也就没有存在的必要了。
由于上面提到的限制,开发者想要在 iOS 平台共享代码,唯一的选择就是打包成静态库 .a 文件,同时附上头文件。
iOS 8/Xcode 6 推出之后,iOS 平台添加了动态库的支持,同时 Xcode 6 也原生自带了 Framework 支持。
.a
和.framework
的区别:
-
.a
是纯二进制文件,.a
文件不能单独使用,至少要有.h
文件配合 -
.framework
除了二进制文件外,还包含一些资源文件(头文件,plist等),由于自身包含了头文件,所以.framework
可以单独使用。
6.iOS设备架构
模拟器型号 | 架构 |
---|---|
iPhone4s-iPnone5 | i386 |
iPhone5s-iPhone8 | x86_64 |
真机型号 | 架构 |
---|---|
iPhone3gs-iPhone4s | armv7 |
iPhone5-iPhone5c | armv7s |
iPhone5s-iPhone8 | arm64 |
PS:支持armv7的静态库可以在armv7s上正常运行。
7.查看静态库支持的架构
.a:lipo -info xxx.a
.framework:lipo -info xxxx
注:xxxx为framework中小白页,不是xxx.framework