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静态库
新建工程,选择iOS\Framework
& Library\Cocoa 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就能看到
变化,依然支持
断点调试.
应用举例