库
库(Library)说⽩了就是⼀段编译好的⼆进制代码,加上头⽂件就可以供别⼈使⽤。
库的作用:
- 隐藏代码。某些代码需要给别⼈使⽤,但是我们不希望别⼈看到源码,就需要以 库的形式进⾏封装,只暴露出头⽂件。
- 提高编译速度。对于某些不会进⾏⼤的改动的代码,我们想减少编译的时间,就可以 把它打包成库,因为库是已经编译好的⼆进制了,编译的时候只需 要 Link ⼀下,不会浪费编译时间。
常用库文件格式:.a、.dylib、.framework、.xcframework、.tbd
xcframework
能够表示多个平台和架构的分发二进制库文件。与framework相比优势:
- 可以用单个文件提供多个平台的分发二进制文件
- 与Fat Header 相比,可以按照平台划分,可以包含相同架构不同平台的文件
- 在使用时,不需要再通过脚本去剥离不需要的架构体系
.tdb
本质上就是⼀个YAML描述的⽂本⽂ 件。作⽤是:
- ⽤于记录动态库的⼀些信息,包括导出的符号、动态库的架构信息、动态库的依赖信息
- ⽤于避免在真机开发过程中直接使⽤传统的dylib。
- 对于真机来说,由于动态库都是在设备上,在Xcode上使⽤基于tbd格式的伪 framework可以⼤⼤减少Xcode工程占用的空间⼤⼩。
Framework
将库的⼆进制⽂件,头⽂件和有关的资源⽂件打包到⼀起,⽅便管 理和分发。我们生成的Framework 和系统的 UIKit.Framework 还是有很⼤区别。系统的 Framework 不需要拷⻉到⽬标程序中,我们⾃⼰做出来的 Framework 哪怕 是动态的,最后也还是要拷⻉到 App 中(App 和 Extension 的 Bundle 是 共享的),因此苹果⼜把这种 Framework 称为 Embedded Framework
Embedded Framework:开发中使⽤的动态库会被放⼊到ipa下的framework⽬录下,基于沙盒运⾏。不同的App使⽤相同的动态库,并不会只在系统中存在⼀份。⽽是会在多 个App中各⾃打包、签名、加载⼀份。
.swiftmodule
在 Xcode 9 之后,Swift 开始⽀持静态库。
Swift 没有头⽂件的概念,那么我们外界要使⽤Swift中⽤public修饰的类和函数 怎么办?
- Swift库中引⼊了⼀个全新的⽂件.swiftmodule。
- .swiftmodule 包含序列化过的 AST(抽象语法树,Abstract Syntax Tree),也包含 SIL(Swift 中间语⾔,Swift Intermediate Language)。
常用架构:
- iOS/iPad:arm64
- iOS/iPad Simulator:x86_64 arm64
- Mac Catalyst: x86_64 arm64
- Mac: x86_64 arm64
静态库
静态库即静态链接库:可以简单的看成⼀组⽬标⽂件的集合。即很多⽬ 标⽂件经过压缩打包后形成的⽂件。Windows 下的 .lib,Linux 和 Mac 下的 .a。Mac独有的.framework。
静态库默认仅将⽤到的⽂件链接进去。
缺点: 浪费内存和磁盘空间,模块更新困难
动态库
动态库在编译时并不会被拷⻉到⽬标程序中,⽬标程序 中只会存储指向动态库的引⽤。等到程序运⾏时,动态库才会被真正加 载进来。格式有:.framework、.dylib、.tdb。
缺点:会导致⼀些性能损失。但是可以优化,⽐如延迟绑定(Lazy Binding)技术
动态库使用到的几个常量:
- @rpath:运⾏时
@rpath
指示dyld
按顺序搜索路径列表,以找到动态库。@rpath
保存⼀个或多个路径的变量 -
@executable_path
:表示可执⾏程序所在的⽬录,解析为可执⾏⽂件的绝对路径。 -
@loader_path
:表示被加载的Mach-O
所在的⽬录,每次加载时,都可能 被设置为不同的路径,由上层指定。
workspace
workspace 作用:
- 可重⽤性。多个模块可以在多个项⽬中使⽤。节约开发和维护时间。
- 节省测试时间。单独模块意味着每个模块中都可以添加测试功能。
- 更好的理解模块化思想。
网友评论