库通常是封装好的代码,便于复用。例如 GitHub 上能够看到的开源库,开箱即用。html
下面咱们主要说的,是编译成二进制的库。ios
根据 Link 的方式,分红了2种库,静态库和动态库。git
静态库,即静态连接库。不一样平台的文件格式以下:github
系统 | 静态库文件格式 |
---|---|
Windows | .lib |
Linux | .a |
MacOS/iOS | .a |
静态库的特色,在于编译的时候会直接复制到目标程序里。segmentfault
意味着代码在目标程序中,不会再改变了。如图:框架
动态库,即动态连接库。 不一样平台的文件格式以下:工具
系统 | 动态库文件格式 |
---|---|
Windows | .dll |
Linux | .so |
MacOS/iOS | .dylib |
动态库的特色,在于编译的时候,并不会被拷贝到目标程序中。post
目标程序中,只会存储指向动态库的引用。程序运行时,动态库才真正被加载。gradle
而同一个动态库,能够被多个程序使用。如图:code
Framework 其实是一个 bundle 或者说特殊形式的文件夹,将库的 二进制文件/头文件/资源文件 打包到一块儿。
Framework 能够选择建立为动态或者静态。
因为 .a /.dylib 等只能打包库的二进制代码,能够用如下公式区别:
动态库/静态库 + .h + 资源文件 = Framework.
制做 Framework 已经有不少教程,能够直接谷歌百度查阅,这里就不纠结具体过程了。能够参考这篇文章->静态库和动态库的制做(OC、Swift)
真正动态的 Framework ,只有苹果自家的 UIKit.Framework,Foundation.Framework 等。
因为 iOS 的沙盒机制,本身建立的 Framework 和系统 Framework 不一样,App 中使用的 Framework 运行在沙盒里,而不是系统中。每一个 App 都只能用本身对应签名的动态库,作不到多个 App 使用一个动态库。
若是不一样的 App 使用了一样的 Framework,仍是会有多份的 Framework 被分别签名,打包和加载。
因此,iOS 上的动态库只能是私有的,咱们没法将动态库放置在除了自身沙盒之外的地方。
CocoaPods 是 iOS 项目的依赖管理工具,相似于 Android 的 gradle。不过gradle 还能负责构建, CocoaPods 只管理依赖。
CocoaPods 目前分别支持了 Framework 动态库
和 .a 静态库
2种方式。
默认使用的是 .a 静态库的方式,主工程依赖 libPods.a,经过脚本,把资源等文件复制到目标目录。
在 Podfile 使用了
use_frameworks!
进行声明,则使用 Framework 动态库的形式.主工程对 Pods 的依赖为 Pods.framework。
因为 Xcode9 以前 Swift 项目不支持静态库,若是为 Swift 项目,就必须采用 user_frameworks!
声明。
关于 Xcode9 之后使用 Swift 静态库的,能够参考下面的文章: