重点 (三十) : 静态库
简介
什么是库?
库是程序代码的集合,是共享程序代码的一种方式
根据源代码的公开情况,库可以分为2种类型
开源库
公开源代码,能看到具体实现
比如SDWebImage、AFNetworking
闭源库
不公开源代码,是经过编译后的二进制文件,看不到具体实现
主要分为:静态库、动态库
1.png2.png
3.png
4.png
5.png
6.png
7.png
8.png
.a的制作
如果想让一个.a文件能同时用在真机和模拟器上,需要进行合并
在终端输入指令
lipo -create Debug-iphoneos/libMJRefresh.a Debug-iphonesimulator/libMJRefresh.a -output libMJRefresh.a
蓝色部分是固定指令
红色、紫色是真机和模拟器.a文件的路径
绿色是所合成.a文件的路径
.a文件的体积(一般情况下)
真机用的.a > 模拟器用的.a
所合成.a == 真机用的.a
- 模拟器用的.a
通过lipo –info libMJRefresh.a可以查看 .a 的类型(模拟器还是真机)
模板制作.framework
• 手工制作 .framework 过于复杂,借助开源模板进行制作会比较简单
• 模板地址
• https://github.com/kstenerud/iOS-Universal-Framework
• 安装模板
• 在终端下进入iOS-Universal-Framework/Fake Framework文件夹
• 执行指令./install.sh 1.png
2.png
3.png
制作静态库的注意点
无论是 .a 静态库还是 .framework 静态库,最终需要的都是:
二进制文件 + .h + 其它资源文件
.a 和 .framework 的使用区别
.a 本身是一个二进制文件,需要配上 .h 和 其它资源文件 才能使用
.framework 本身已经包含了 .h 和 其它资源文件,可以直接使用
图片资源的处理
如果静态库中用到了图片资源,一般都放到一个bundle文件中,bundle名字一般跟 .a 或 .framework 名字一致
bundle的创建:新建一个文件夹,修改扩展名为.bundle 即可,右击bundle文件,显示包内容,就可以往bundle文件中放东西
制作静态库的注意点
多文件处理
如果静态库需要暴露出来的 .h 比较多,可以考虑创建一个主头文件
(一般 主头文件 和 静态库 同名)
在主头文件中包含所有其他需要暴露出来的 .h 文件
使用静态库时,只需要#import 主头文件
实际上苹果官方就是这么做的,例如:#import <UIKit/UIKit.h>
.framework为什么既是静态库又是动态库
系统的 .framework 是动态库
我们自己建立的 .framework 是静态库
4.png
静态库
- 静态库简介
1.什么是库?
就是程序代码的集合, 是共享程序代码的一种方式
2.库的分类?
开源库
公开源代码, 能看到具体实现
例如MJExtension, MJRefresh, AFNetworking...
闭源库
不公开源代码, 是经过编译后的二进制文件, 看不到具体实现
主要分为: 静态库
和 动态库
3.静态库的存在形式
.a
.framework
静态库的存在形式
.dylib
.framework
5.静态库和静态库的区别?
静态库在链接时,
会被完整的复制到可执行文件中; 被多次使用, 就有多份拷贝;
动态库则不会复制,
只有一份. 程序运行时动态加载到内存; 系统只加载一次, 多个程序共用, 节省内存;
但是!!!!
项目中如果使用到自己的动态库, 不允许上架!
6.静态库应用场景?
保护自己的核心代码
将MRC的项目,打包成静态库,
可以在ARC下直接使用, 不需要转换
注意:Xcode6以前是没有Cocoa Touch Framework这个选项的
1.png1.都是利用第三方框架
2.png
- 静态库的制作
1.创建项目时, 直接选择静态库
2.设置需要暴漏的头文件
3.在模拟器环境下编译(得到模拟器环境下的静态库)
4.在真机环境下编译(得到真机环境下的静态库)
5.注意事项:
模拟器下的静态库和真机下的静态库不能共用
6.注意静态库所支持的架构
不同机型的CPU, 对应的架构不同; 模拟器: 4s----5 : i386
5s----6sPlus : x86_64
真机: 3gs---4s : armv7
5/5c :
armv7s(armv7兼容armv7s)
5s---6sPlus: arm64
查看静态库支持的架构lipo -info 库文件
解决方案: Build Settings -> Build Active
7.合并静态库(模拟器和真机都支持)
lipo
-create 库1 库2 -output 终极库
注意点:合并后的静态库文件比较大(真机静态库 + 模拟器静态库)
8.Debug版本和Release版本
区别:
1.vs中的程序有debug和release两个版本,Debug通常称为调试版本,通过一系列编译选项的配合,编译的结果通常包含调试信息,而且不做任何优化,以为开发 人员提供强大的应用程序调试能力。而Release通常称为发布版本,是为用户使用的,一般客户不允许在发布版本上进行调试。所以不保存调试信
息,同时,它往往进行了各种优化,以期达到代码最小和速度最优。为用户的使用提供便利。
2.debug程序通常比release程序要慢,尤其是处理视频方便release要比debug快很多。在release模式对程序进行调试的时候经常会遇到变量虽然初始化了,但是在查看其值的时候却发现是一个随机的数并不是初始化的值,有时候在对变量进行监视的时候了,会出现找不到变量的情况,原因大致如下:
3.debug跟release在初始化变量时所做的操作是不同的,debug是将每个字节位都赋成0xcc, 而release的赋值近似于随机。如果你的程序中的某个变量没被初始化就被引用,就很有可能出现异常:用作控制变量将导致流程导向不一致;用作数组下标将会使程序崩溃;更加可能是造成其他变量的不准确而引起其他的错误。所以在声明变量后马上对其初始化一个默认的值是最简单有效的办法,否则项目大了你找都没地方找。代码存在错误在debug方式下可能会忽略而不被察觉到。debug方式下数组越界也大多不会出错,在release中就暴露出来了,这个找起来就比较难了。
4.只有DEBUG版的程序才能设置断点、单步执行、使用
TRACE/ASSERT等调试输出语句。REALEASE不包含任何调试信息,所以体积小、运行速度快。
修改方案:
Edit Scheme
9.真正开发中的静态库制作
建立一个项目, 在项目中, 创建一个静态库; 好处: 可以调试静态库
framework 静态库制作
通静态库制造方法一致
默认情况下, 制作的是动态库
变成静态库
b s -> match
***********************黑马*********************
- 为什么要做静态库
================================================================================
1>
国内的企业,掌握有核心技术,同时是又希望更多的程序员来使用其技术,因此采用"闭源"的方式开发使用
例如:百度地图,友盟,JPush等
2>
在企业开发中,一些核心技术或者常用框架,出于安全性和稳定性的考虑,也会提供静态库给程序员使用
- 静态库的特点
================================================================================
.a + .h
- 静态库简单演练
================================================================================
1>
新建CZTools项目
2>
创建一个类方法,实现一个简单的加法
3>
编译
注意,在编译静态库时,需要编译两个版本 ->
真机(arm) | 模拟器(i386)
4>
新建项目将编译生成的.a + .h拖到项目中使用
- 静态库中的资源包的使用
================================================================================
问题:有些第三方库会使用到一些图片素材,例如公司的logo等。
但是由于Xcode默认在编译时会把所有的素材文件导入到mainBundle中,为了避免与使用静态库的程序冲突。
在静态库中如果要使用图片素材,会创建一个文件后缀自行改为.bundle
1>
建立bundle,并且向其中添加图片
2>
创建一个类方法,返回图片
3>
编译
4>
调用方如果需要使用,需要导入.h + .a + XXX.bundle
- 静态库中的自定义视图
================================================================================
问题:程序需要测试
静态库如何测试呢?
创建复合项目
1>
复习块代码传值
- 静态库的使用
================================================================================
新建项目将编译生成的.a + .h拖到项目中使用
- 静态库的种类
================================================================================
静态库文件的版本(4种)
1.真机-Debug版本
2.真机-Release版本
3.模拟器-Debug版本
4.模拟器-Release版本
调试版本VS 发布版本
-
调试版本会包含完整的符号信息,以方便调试
-
调试版本不会对代码进行优化
-
发布版本不会包含完整的符号信息
-
发布版本的执行代码是进行过优化的
-
发布版本的大小会比调试版本的略小
-
在执行速度方面,发布版本会更快些,但不意味着会有显著的提升
- 静态库的合并
================================================================================
检测.a的类型
$ lipo -info
libCZTools.a
合并.a
lipo -create
Debug-iphoneos/libCZTools.a Debug-iphonesimulator/libCZTools.a -output
libCZTools.a
合并.a的好处,开发过程中既可以在真机上调试,也可以在模拟器上调试
合并.a的坏处,如果静态库太大,合并打包后,会非常大,因此很多第三方的静态库的.a是区分版本的
今后在使用.a时一定注意版本