关于 iOS 中的库

库是什么?

库通常是封装好的代码,便于复用。例如 GitHub 上能够看到的开源库,开箱即用。html

下面咱们主要说的,是编译成二进制的库。ios

什么场景使用二进制的库?

  • 保护源代码。平常开发中的各类商业 SDK 就属于此类。只暴露头文件给使用者,而隐藏具体的实现。
  • 加快编译速度。由于是编译完成的二进制,因此编译的时候只须要 Link 一下。

动态库与静态库

根据 Link 的方式,分红了2种库,静态库和动态库。git

什么是静态库?

静态库,即静态连接库。不一样平台的文件格式以下:github

系统 静态库文件格式
Windows .lib
Linux .a
MacOS/iOS .a

静态库的特色,在于编译的时候会直接复制到目标程序里。segmentfault

意味着代码在目标程序中,不会再改变了。如图:框架

3D044AD0-C6D0-40E4-ABD7-AB07945E6E26

什么是动态库?

动态库,即动态连接库。 不一样平台的文件格式以下:工具

系统 动态库文件格式
Windows .dll
Linux .so
MacOS/iOS .dylib

动态库的特色,在于编译的时候,并不会被拷贝到目标程序中。post

目标程序中,只会存储指向动态库的引用。程序运行时,动态库才真正被加载。gradle

而同一个动态库,能够被多个程序使用。如图:code

91EDA5EA-2038-4B89-9ECB-BAA8DD4D94FE

MacOS/iOS 里的 Framework

Framework 其实是一个 bundle 或者说特殊形式的文件夹,将库的 二进制文件/头文件/资源文件 打包到一块儿。

Framework 能够选择建立为动态或者静态。

区别

因为 .a /.dylib 等只能打包库的二进制代码,能够用如下公式区别:

动态库/静态库 + .h + 资源文件 = Framework.

如何制做 Framework?

制做 Framework 已经有不少教程,能够直接谷歌百度查阅,这里就不纠结具体过程了。能够参考这篇文章->静态库和动态库的制做(OC、Swift)

关于动态的 Framework

真正动态的 Framework ,只有苹果自家的 UIKit.Framework,Foundation.Framework 等。

因为 iOS 的沙盒机制,本身建立的 Framework 和系统 Framework 不一样,App 中使用的 Framework 运行在沙盒里,而不是系统中。每一个 App 都只能用本身对应签名的动态库,作不到多个 App 使用一个动态库。

若是不一样的 App 使用了一样的 Framework,仍是会有多份的 Framework 被分别签名,打包和加载。

因此,iOS 上的动态库只能是私有的,咱们没法将动态库放置在除了自身沙盒之外的地方。

CocoaPods 管理库使用的是哪一种形式?

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 静态库的,能够参考下面的文章:

即刻Swift静态库实践

参考

dylib浅析

iOS 静态库,动态库与 Framework

iOS 静态库和动态库的基本介绍和使用

CocoaPods 原理总结

如何打造一个让人愉快的框架

相关文章
相关标签/搜索