iOS开发之动态库与静态库

  • 库是一份可执行代码的二进制代码,可以被操作系统载入内存,并且被识别、使用。
  • 在链接阶段,会将汇编生成的目标文件与引用的库一起链接,打包进可执行文件中。

分类

静态库

  • .a.framework为后缀的文件。
  • 静态库在链接时会被完整的复制到可执行文件中,当静态库被多次使用时,会进行多次复制,从而出现拷贝冗余,造成内存浪费。
  • 优点:不受外部环境的影响,即使删除了静态库,对可执行文件不会造成影响,因为静态库在链接时就已经打包到了可执行文件中,成为 App 的一部分。
  • 缺点:浪费内存空间。如果静态库进行了修改,可执行文件也需要重新编译生成。

注意.a是一个纯二进制文件,而.framework中除了有二进制文件之外还有资源文件。

动态库

  • .tbd.framework.xcframework为后缀的文件。
  • 动态库在链接时不会直接复制,而只会存储指向动态库的引用,等到程序运行时才被载入到内存中,以供使用。
  • 优点:只加载到内存中一次,内存共享,节约内存空间。可以独立于 App 进行更新,因为它并不是 App 的一部分。
  • 缺点:运行时载入会造成性能损失,而且可执行文件依赖外部环境,一旦动态库进行了修改而出现了错误,则会导致程序出现问题。

如何区分

  1. 查看 Build Settings ---> Mach-O Type 的值。
  2. 查看 ipa 的目录结构。
  3. 通过file xxx.a/framework命令查看。

混合使用

  1. 静态库可以依赖静态库。
  2. 动态库可以依赖动态库。
  3. 动态库不能依赖静态库。原因是静态库不需要在运行时再次加载, 如果多个动态库依赖同一个静态库, 则会出现多个静态库的拷贝。

framework

  • 一种资源打包方式,可以将代码文件、头文件、资源文件、文档等集中在一起。
  • 静态framework:打包成 SDK 供别人使用的一般都是静态framework
  • 动态framework:系统提供的framework是动态的。例如:Foundation.frameworkUIKit.framework等。
  • 开发者也可以制作的动态framework,但会受到平台限制,需要通过Embedded Framework的方式进行工作,与系统动态库不同,这种动态库最终也要拷贝到 App 中。

Frameworks,Libraries,and Embedded Content

  • 对于系统动态库,可以将Embed属性设置成Do Not Embed
  • 对于用户动态库,需要将Embed属性设置成Embed
  • 对于静态库,需要将Embed属性设置成Do Not Embed

创建

  1. Xcode 可以直接创建 Static Library 静态库,最终生成.a文件。
  2. Xcode 也可以直接创建 Framework,创建完成后通过 Build Settings ---> Mach-O Type 调整为Dynamic Library或者Static Library

dyld

  • The dynamic link editor(苹果动态链接器),是 iOS 中非常重要的组成部分。
  • 程序启动时,通过dyld将库加载到内存。

优化

Xcode 15 之后可以进一步合并动静态库(mergeable libraries),根据需要设置 Build Settings ---> Create Merged Binary 对应的值即可。

参考

  1. Xcode 15 优化
  2. iOS整理: 关于动态库和静态库
相关推荐
松叶似针7 小时前
Flutter三方库适配OpenHarmony【secure_application】— iOS 端原生模糊遮罩实现分析
flutter·ios·cocoa
vx-bot5556668 小时前
企业微信ipad协议的会话管理机制与本地同步策略
ios·企业微信·ipad
阿捏利12 小时前
详解Mach-O(十三)Mach-O __TEXT
macos·ios·c/c++·mach-o
pop_xiaoli13 小时前
effective-Objective-C 第三章阅读笔记
笔记·ios·objective-c
游戏开发爱好者81 天前
完整教程:App上架苹果App Store全流程指南
android·ios·小程序·https·uni-app·iphone·webview
阿捏利1 天前
详解Mach-O(十四)Mach-O __DATA
macos·ios·c/c++·mach-o
@大迁世界1 天前
iOS 26.4 Beta 1 发布日期敲定:苹果开发者预览版何时杀到?
ios
vx-bot5556661 天前
企业微信ipad协议的多媒体消息处理与文件传输机制
ios·企业微信·ipad
colicode2 天前
Objective-C语音验证码接口API示例代码:老版iOS应用接入语音验证教程
前端·c++·ios·前端框架·objective-c
2501_916007472 天前
ios上架 App 流程,证书生成、从描述文件创建、打包、安装验证到上传
android·ios·小程序·https·uni-app·iphone·webview