ios开发拓展篇一静态库
ios开发拓展篇一静态库
一 , 简单介绍
1,什么是库?
库是程序代码的集合,是共享程序代码的一种方式
2.库的分类
根据源代码的公开情况,库可以分为2种类型
(1) 开源库
公开源代码,能看到具体实现
比如SDWebImage、AFNetworking等第三方框架
(2) 闭源库
不公开源代码,是经过编译后的二进制文件,看不到具体实现
主要分为:静态库, 动态库
二 , 静态库和动态库
1.静态库和动态库的存在形式
静态库:.a 和 .framework
动态库:.dylib 和 .framework
2.静态库和动态库在使用上的区别
静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝(图1所示)
动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存(图2所示)
图1
图2
需要注意的是:项目中如果使用了自制的动态库,不能被上传到AppStore
三 , 静态库的应用场景 (一)
Debug-iphoneos文件夹里面的东西是用在真机上的
Debug-iphonesimulator文件夹里面的东西是用在模拟器上的
(7)创建一个项目,测试使用静态库即可
五 , 静态库的架构问题
- 设备的CPU架构
- 不同的设备使用的CPU是不同的
- CPU的不同造成使用的CPU架构(指令集)不同
- 静态库有其支持的CPU架构
- 如果静态库在不支持的CPU架构上运行就会报错
- 模拟器使用的CPU架构
- iPhone4s-iPhone5 : i386
- iPhone5s-iPhone6plus : x86_64
- 真机使用的CPU架构
- iPhone3gs-iPhone4s : armv7
- iPhone5-iPhone5c : armv7s
- iPhone5s-iPhone6plus : arm64
- 唯一特殊:只要支持armv7的静态库可以在armv7s上正常运行
- 查看静态库支持的架构
- lipo -info 静态库
- 合并静态库
- lipo -create 静态库1 静态库2 -output 合并的静态库
六 , 编译.framework静态库
(1) 建项目时,选择Framework&Library-->Frameword
(2)默认创建的项目中有一个主头文件,可以将其他头文件在该头文件中import一下
(3)编写核心代码
(4)编译前,将头文件暴露出去
(5)默认情况直接编译的库位动态库,可以修改配置改成静态库
(6)选择模拟器和真机分别编译
(7)打开Products即可看到.framework库
(8),把编译好的静态库拿去用就是了
七 , .a 和 .framework 的使用区别
.a 本身是一个二进制文件,需要配上 .h 和 其它资源文件 才能使用
.framework 本身已经包含了 .h 和 其它资源文件,可以直接使用
八 , 开发调试静态库
如果希望一遍开发一遍调试静态库,可以在项目中直接添加静态库
(1)在项目中,按照下面步骤即可
.点击项目-->左下角+号
(2)选择希望开发的静态库类型(.a/.framework)
(5)测试之后,按照之前步骤打包成静态库即可
九 , 补充
(1)为什么要做静态库
1> 国内的企业,掌握有核心技术,同时是又希望更多的程序员来使用其技术,因此采用"闭源"的方式开发使用
例如:百度地图,友盟,JPush等
2> 在企业开发中,一些核心技术或者常用框架,出于安全性和稳定性的考虑,也会提供静态库给程序员使用
(2)静态库中资源包的使用
问题:有些第三方库会使用到一些图片素材,例如公司的logo等。
但是由于Xcode默认在编译时会把所有的素材文件导入到mainBundle中,为了避免与使用静态库的程序冲突。
在静态库中如果要使用图片素材,会利用bundle的手段
1> 建立bundle,并且向其中添加图片
2> 创建一个类方法,返回图片
3> 编译
4> 调用方如果需要使用,需要导入 .h + .a + XXX.bundle
(3)多文件处理
如果静态库需要暴露出来的 .h 比较多,可以考虑创建一个主头文件(一般 主头文件 和 静态库 同名)
在主头文件中包含所有其他需要暴露出来的 .h 文件
使用静态库时,只需要#import 主头文件
实际上苹果官方就是这么做的,例如:#import <UIKit/UIKit.h>
(4)静态库的合并
# 检测.a的类型
$ lipo -info libCZTools.a
# 合并.a
lipo -create Debug-iphoneos/libTools.a Debug-iphonesimulator/libTools.a -output libTools.a
# 合并.a的好处,开发过程中既可以在真机上调试,也可以在模拟器上调试
# 合并.a的坏处,如果静态库太大,合并打包后,会非常大,因此很多第三方的静态库的.a是区分版本的
# 今后在使用.a时一定注意版本

浙公网安备 33010602011771号