静态库和动态库
基础概念
- 静态库和动态库的存在形式
- 静态库:
.a
和.framework
- 动态库:
.dylib
和.framework
- 静态库:
静态库和动态库在使用上的
区别
静态库:链接时,静态库会被完整地复制到可执行文件中,程序间
不能共用
,被几个程序
使用就有几份冗余
拷贝动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序
共用
,节省内存
注意
:如果使用了自制的动态库
,不能
被上传到App Store
静态库
- 静态库的
作用
- 封装
核心
代码 - 将
MRC
项目制作成静态库,在ARC
环境中就不会
报错了
- 封装
- 资源文件是
不能
打包到静态库中的 - 静态库是分
模拟器版本
和真机版本
静态库中资源包
的使用
- 有些第三方库需要使用到一些图片资源,例如公司的logo等
- 在静态库中要使用图片资源可以利用bundle的手段来解决静态库资源与
mainBundle
中的资源冲突的问题- 建立
bundle
,并且向其中添加图片 - 创建一个
类方法
,返回图片 - 编译生成静态库
- 调用方如果需要使用,需要导入
.h + .a + XXX.bundle
- 建立
静态库文件版本(4种
)
- 真机-Debug版本
- 真机-Release版本
- 模拟器-Debug版本
- 模拟器-Release版本
静态库文件支持的系统架构
- 每一个设备都有属于自己的CPU架构(4s/6plus)
- 每一个静态库支持的架构是固定
模拟器
架构- 4s ~ 5 :
i386
- 5s ~ 6plus :
x86_64
- 4s ~ 5 :
真机
架构- 3gs ~ 4s :
armv7
- 5/5c :
armv7s
,静态库只要支持了armv7,就可以跑在armv7s的架构上 - 5s ~ 6plus :
arm64
- 5/5c :
- 3gs ~ 4s :
- 生成静态库文件
注意事项
静态库操作相关命令
- 查看
.a
文件支持的系统架构:lipo -info xxx静态库
- 查看
更详细
的信息:lipo -detailed_info xxx静态库
- 合并
.a
文件,将真机
文件和模拟器
文件进行合并:lipo -create 静态库1 静态库2 -output 合并后的静态库
- Debug-iphone
os
/libStatic.a为真机
对应的.a文件 - Debug-iphone
simulator
/libStatic.a为模拟器
对应的.a文件
- Debug-iphone
- 合并.a的
好处
:开发过程中既可以在真机上使用,也可以在模拟器上使用 - 合并.a的
坏处
:静态库太大
,因此很多第三方的静态库的.a是区分版本
的,所以使用前先查看
.a文件支持的系统架构
- 支持64-bit后程序包会变大么?
开发中创建.a静态库
的步骤
- 新建一个Single View Application
- 添加
.a
静态库项目,步骤如下图:- 第一步:添加静态库项目
- 第二步:添加静态库项目后会产生以下文件
- 第三步:添加
要暴露
的头文件 - 第四步:添加静态库文件
开发中创建.framework静态库
的步骤
- 前面的步骤大致和
.a静态库
文件差不多 这里说说
不同点
默认
情况下.framework是动态库类型
- 设置成静态库类型
- 生成的.framework静态库其实是一个
文件夹
,其内部有一个Headers
文件夹用于存放头文件 - 引用静态库,编译器会
自动
添加.framework静态库文件 补充
:动态库文件可以使用但是不能
上架
- 查看.framework静态库所支持的系统架构
- .framework文件
本质
是一个文件夹
- .framework文件
- 使用命令
查看
或合并
这里的文件即可,将合并后的文件替换.framework文件夹内对应的文件即可