iOS静态库 ---iOS-Apple苹果官方文档翻译
• 怎么用?
是什么?
1什么是库? 库是共享程序代码的方式,一般分为静态库和动态库。 2静态库与动态库的区别? 静态库:链接时完整地拷贝至可执行文件中,被多次使⽤用就 有多份冗余拷⻉贝。 动态库:链接时不复制,程序运行时由系统动态加载到内存, 供程序调用,系统只加载一次,多个程序共用,节省内存。 3iOS里静态库形式?
.a和.framework
4iOS里动态库形式?
.dylib和.framework
是什么?
5.framework为什么既是静态库又是动态库? 系统的.framework是动态库,我们自己建立的.framework是静 态库。
6.a与.framework有什么区别?
区别不是很大。 .a是一个纯二进制文件,.framework中除了有二进制文件之外还 有资源文件。 .a文件不能直接使用,至少要有.h文件配合,.framework文件可 以直接使用(.h等资源已经在其内部,图片资源一般再打一 个.bundle文件)。
.a + .h + sourceFile = .framework。
建议用.framework.
是什么?
为什么?
1为什么要使用静态库?
• 方便共享代码,便于合理使用。
• 实现iOS程序的模块化。可以把固定的业务模块化成静态
库。
• 和别人分享你的代码库,但不想让别人看到你代码的实现。
• 开发第三方sdk的需要。
怎么做?
制作.a静态库 制作.framework静态库(手工法) 制作.framework静态库(模板法)
怎么做?--制作.a静态库
新建工程,选择iOSFramework & LibraryCocoa Touch Static Library
怎么做?--制作.a静态库
点击next输入项目名称(这里举例子用MFKit)
怎么做?--制作.a静态库
点击next,点击create创建工程
怎么做?--制作.a静态库
添加需要的方法(这里是testKit)并在.h中实现
怎么做?--制作.a静态库 或者添加新类(这里是MFClass)并添加方法,加以实现
怎么做?--制作.a静态库
点击MFKit工程文件,选择target下的BuildPhases->Copy Files->’+’
怎么做?--制作.a静态库
选择要暴露出来的.h文件,点击添加。不需要暴露的文件,就 不用添加.h,但其.m是会被编译到.a里的。
怎么做?--制作.a静态库
command + B编译,编译后libMFKit.a文件会变成黑色
怎么做?--制作.a静态库
选择模拟器再次编译(真机和模拟器需要运行的.a文件是分开
的)
选择libMFKit.a文件右键,show in finder
怎么做?--制作.a静态库
运行模拟器,要用模拟器文件夹下的.a,运行真机的话,要用 真机文件夹下的.a,除此之外还可以讲两个.a文件合并成一 个.a,合并后的.a在模拟器和真机下都能运行。具体方法终端 下运行:lipo -create xxx/xxx/xx.a xxx/xxxx/xxx.a - output xx/xx/xx.a
怎么做?--制作.a静态库
注意每个文件要带绝对路径,为了方便我们一般都把要合并的
文件放在一个文件夹里,生成的文件也放在这个文件夹里,上
面的例子是在桌面上完成的。
怎么做?--制作.framework静态库(手工法)
与制作.a静态库 一样,先建立一 个基于.a的工程 (这里是 FQKit)。删除 FQKit这个 target,当然也 可以删除Test相 对应的Target。
怎么做?--制作.framework静态库(手工法)
怎么做?--制作.framework静态库(手工法)
添加一个target
怎么做?--制作.framework静态库(手工法)
配置环境变量:
选中Target->Build Settings
Architecture下
Base SDK 从“Latest OS X(OS X 10.8)”改为 “Lastest iOS(iOS 7.0)”
Architecture 改为 Standard(armv7) Deployment下
OS X deployment target 修改为“compiler Default”
Target Device Family 修改为需要的,这⾥里我改为了“iPhone”
怎么做?--制作.framework静态库(手工法)
Linking下:Dead Code Striping 改为 “NO”
Link with Standard Libraries 改为“NO” Mac-O type改为 “Relocatable Object File”
怎么做?--制作.framework静态库(手工法)
Packaging下:Wrapper Extension改为“framework”
1. 修改⽬目标的info
将Bundle OS Type Code修改为“FMWK” 2. 修改预编译头NetGameFrameworkPrefix.pch 注释掉
#ifdef __OBJC__
#import
#endif
怎么做?--制作.framework静态库(手工法)
配置完环境变量就可以像用.a一样,向其中添加需要使用的类 和方法了。添加完类和方法后,添加add copy header Build Phase,然后像其中添加头文件
怎么做?--制作.framework静态库(手工法)
怎么做?--制作.framework静态库(手工法)
怎么做?--制作.framework静态库(手工法)
怎么做?--制作.framework静态库(手工法)
这里的原理和生成.a静态库的原理一样,编译后需要暴露的.h 文件就会在.framework中出现。然后也是分模拟器和真机编 译,也可以用lipo把两者合二为一。
怎么做?--制作.framework静态库(手工法)
怎么做?--制作.framework静态库(手工法)
注意此时用lipo处理的文件并不是xxx.framework,而是其 内部的二进制文件。
怎么做?--制作.framework静态库(模板法)
.framework方法需要配置大量的环境变量,比较麻烦,其实 网上有个开源的模板叫做iosframework,下载压缩包,解压 后终端下安装install.sh,就可以直接生成.framework的工 程,其它的地方就可以参考我们上面讲的两种方法,但使用iosframework可能会有iOS版本间兼容的问题, 需要大家 注意,这里就不在赘述过多的方法了。 有兴趣的同学可以 google一下iosframework。
怎么做?--制作静态库时的几点注意
1注意理解:无论是.a静态库还.framework静态库,我们需要 的都是二进制文件+.h+其它资源文件的形式,不同的是,.a本 身就是二进制文件,需要我们自己配上.h和其它文件才能使用, 而.framework本身已经包含了.h和其它文件,可以直接使用 (图片资源接下来讨论) 2图片资源的处理:两种静态库,一般都是把图片文件单独的 放在一个xx.bundle文件中,一般xx.bundle的名字和.a 或.framework的名字相同。xx.bundle文件很好弄,新建一个 文件夹,把它改名为xx.bundle就可以了,右键,显示包内容 可以向其中添加图片资源(一会具体举例子)。
怎么做?--制作静态库时的几点注意
3category是我们实际开发项目中经常用到的,把category打 成静态库是没有问题的,但是在用这个静态库的工程中,调用 category中的方法时会有找不到该方法的运行时错误 (selector not recognized ),解决办法是:在使用静态库的工程中配置other linker flags的值为-ObjC( 一会具体举例子)。
怎么做?--制作静态库时的几点注意
4,如果一个静态库很复杂,需要暴露的.h比较多的话,就可 以在静态库的内部创建一个xx.h文件(一般这个xx.h文件的名 字和静态库的名字相同),然后把所有需要暴露出来的.h文件 都集中放在这个.h文件中,而那些原本需要暴露的.h都不需要 再暴露了,只需要把xx.h暴露出来就可以了。这样在用的时候 就方便很多了,只需要#import 就可以了, 实际上苹果本身就是这么做的,例如:!
#import !
怎么用?
方法1:把.framework或者.a拷贝到目标工程文件夹中,然后 添加到工程中(一般方在frameworks文件夹下),和使用其 他系统的库一样使用就可以了。 如果自己是开发sdk的开发人员,就会遇到一个问题,要准备 两个工程,一个sdk工程,一个测试工程,要测试sdk的话, 先要把sdk打包为静态库,然后再把静态库拷贝到测试工程中 测试,每次修改,都会做上述的冗余的工作,如何才能更方便 的开发自己的sdk?
怎么用?
方法2:把framework的工程拷贝到要测试或者使用它的目标 工程中.
怎么用?
打开目标工程,在Frameworks文件夹上右键选择Add files to “xxx”,在刚刚导入的framework中把.xcodeproj文件加进来
怎么用?
怎么用?
点击target下⾯面的Build Phases->Link Binary With Libraries- >"+",选择我们framework中的.framework⽂文件,然后添加.
怎么用? 在要使用的地方加入framework的头文件(此处编译器没有自
动提示,但不是错误)
然后就可以用framework里的东西了,也可以直接改变 framework工程中的类,不用对该工程单独编译,直接运行目标 工程,就能看到变化.还可以断点调试.
怎么用?
还有一个更简单的方法: 方法3:新建一个测试工程,添加一个开发sdk的target
怎么用?
怎么用?
图中的1对应3中的 TestFFF.app,2对应3
中的
AniiiFMWK.framewor k 最重要的一步,还是把 framework工程中的 库,引入到目标工程中
怎么用?
怎么用?
在用到的类中 引入framework 中对应的头文 件,就可以用了, 修改framework 的代码仍然不 用对它编译,直 接运行目标 target就能看到 变化,依然支持 断点调试.
应用举例