一、背景
如果你有写得好的代码想要给别人用,可是又不想让别人看到你的源代码,那么静态库就可以派上用场.在公司中主要是有一个固定的比较重要的逻辑代码可以编写成为静态库的方式,防止同事修改.比较知名的这样做的第三方库: 百度地图
,友盟
,leanCloud
,环信
等等.
二、静态库的基本概念
1.静态库就是封装.m的实现代码
2.如果看到了.m就代表不是静态库
3.如果看见了.a/framework就代表是静态库
4.制作静态库时,打包的时候系统会默认把自带类文件.h[就是创建静态库的时候自动生成的.h文件]导出,如果是自己添加的类,则不会默认导出.那么我们如何添加自己的类呢?不着急,往下看,我们后面在具体操作的时候会讲.
三、编译器架构
模拟器
x86_64: 5S / 6 / 6P 64位 ```
**真机**
```armv7: 4 / 4S
armv7S: 5 / 5C (静态库只要支持了armv7,就可以跑在armv7S上)
arm64: 5S / 6 / 6P / 6S / 6SPlus ```
##四、制作`.a`静态库
*这个的制作方式有很多种,我这里介绍边开发边测试的一种方式,也是我认为比较实用简单的一种*
1. 创建一个工程项目
2. 创建静态库
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1679203-77b4b3ecc6bb3cc9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
点击加号后:
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1679203-026f537b6bb86722.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
3.填写自己的静态库名称创建完成后:[**注:**这里的`WYTool`是我创建的静态库名称]
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1679203-dd1fe42d279f39cf.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
4.正常编写编写WYTool.h和WYTool.m中的代码,例如我的:
// 这个是WYTool.h //
import <Foundation/Foundation.h>
@interface WYTool : NSObject
- (int)run;
@end
// 这个是WYTool.m //
import "WYTool.h"
@implementation WYTool
- (int)run {
return 10;
}
@end
5.可以在当前项目中导入`WYTool.h`进行测试,如果没有什么问题我们就可以进行打包静态库的操作了.
6.在创建一个类`WYPerson.h`
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1679203-2901ceecb40276bb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
7.添加要导出的.h文件[我这里添加的是`WYPerson.h`]
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1679203-6f21531fb0b8f281.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
8.选中我们创建的静态库
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1679203-26ed521a973de181.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
9.选择静态库的状态[`Release` 或者 `Debuge`],我在这里选择的是`Release`
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1679203-0b717af2b752be32.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1679203-86781cfca65b3679.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
10.编译生成.a[**注**编译模拟器的时候.a是不会变黑的,只有在真机上编译后才会变黑]
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1679203-8858aadb1396bac2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1679203-f38149a2868c9aef.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
11.找到编译后的.a拖入项目可用
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1679203-4d1a8c2b51dcdb3b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1679203-2add50b08e49c5b1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
## 五.制作.framework的静态库
1. 创建.framework
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1679203-b5f2352e7235bd31.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
2.动态库(framework)转换静态库
Mach-O Type
点击项目---> setting--->mach-0
type Static Library
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1679203-39e59058adf5023c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
3.为静态库创建了一个类`WYStudent`,把自己创建的类以`#import <WYDynamic/PublicHeader.h>`的形式导入到`WYDynamic.h`[系统创建]中
4.设置导出的头文件
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1679203-5f32984184e39e36.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
5.接下来的和上面制作.a一样了[四的8~10],需要提的是,得到.framework后,只需要把.framework拖入到项目就可以使用了.
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1679203-5408220ceaa87d4d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
6.拖入到项目中的时候
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1679203-4184274fee91b52f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
## 六、知识补充
1. **合并静态库**
如何合并模拟器不同的架构
* 方法一: 使用lipo命令可以合并真机和模拟器
lipo
-create libWYTool.a Release-iphonesimulator/libWYTool.a -output WYToolAll.a
* 方法二: 配置是否只编译当前架构
项目--> setting --> Build --> NO
2. **静态库版本**
Debug : 调试版本 丰富的调试代码 (NSLog)
Release : 发布版本 去除了调试代码--> 体积会更小, 运行速度会变快--> 用户不会有明显的感觉
如果真要发布, 应该发布Release版本
Debug版本编译模拟器架构时, 默认就是当前架构
Release版本编译模拟器架构时, 默认就是多种架构