原文网址:http://www.cnblogs.com/wendingding/p/3893095.htmlhtml
iOS开发拓展篇—静态库框架
1、简单介绍iphone
1.什么是库?htm
库是程序代码的集合,是共享程序代码的一种方式blog
2.库的分类图片
根据源代码的公开状况,库能够分为2种类型ip
(1)开源库内存
公开源代码,能看到具体实现资源
好比SDWebImage、AFNetworking开发
(2)闭源库
不公开源代码,是通过编译后的二进制文件,看不到具体实现
主要分为:静态库、动态库
2、静态库和动态库
1.静态库和动态库的存在形式
静态库:.a 和 .framework
动态库:.dylib 和 .framework
2.静态库和动态库在使用上的区别
静态库:连接时,静态库会被完整地复制到可执行文件中,被屡次使用就有多份冗余拷贝(图1所示)
动态库:连接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存(图2所示)
图1
图2
注意点:项目中若是使用了自制的动态库,不能被上传到AppStore
3、静态库的制做(.a)
(1)选择“Cocoa Touch Static Library”
(2)输入静态库名称(以MJRefresh为例)
(3)删除自动生成的文件
(4)添加库须要包含的源代码
注意:资源文件是不能打包到.a文件中的。
(5)选择须要暴露出来的.h文件,.m文件会自动编译到.a文件中
添加,并选择须要暴露的头文件
设置(移动)为公开的。
(6)选择真机设备,而后 Command+B 编译,libMJRefresh.a文件从红色变为黑色
这个时候,程序会报错,由于框架中包含了CGFloat,它是UIKit里面的东西,所以能够在pch文件中包含UIKit框架。
再次进行编译,编译成功后生成的.a文件就是静态库。
(7)选择模拟器,依然 Command+B ,模拟器和真机环境下用的.a文件是分开的
(8)右击“Show In Finder”,查看制做好的.a文件
说明:
Debug-iphoneos文件夹里面的东西是用在真机上的
Debug-iphonesimulator文件夹里面的东西是用在模拟器上的
若是Scheme是Release模式,生成的文件夹就以Release开头
(9)合并两个文件
若是想让一个.a文件能同时用在真机和模拟器上,须要进行合并
在终端输入指令:
lipo -create Debug-iphoneos/libMJRefresh.a Debug-iphonesimulator/libMJRefresh.a -output libMJRefresh.a
说明:
蓝色部分是固定指令
红色、紫色是真机和模拟器.a文件的路径
绿色是所合成.a文件的路径
生成的文件(静态库)
提示:
1)文件大小.a文件的体积(通常状况下)
真机用的.a > 模拟器用的.a
所合成.a == 真机用的.a + 模拟器用的.a
2).a的类型
经过lipo –info libMJRefresh.a能够查看 .a 的类型(模拟器仍是真机)
(10)如何使用.a
直接将.a、.h、资源文件拖拽到其余项目中便可
别人拿到的框架,只有.a文件和暴露出来的头文件
注意:若是库中还包含了一些资源文件(如图片等),那么资源文件也应该放在上面的文件夹中。
4、制做静态库的注意点
(1)注意:
不管是 .a 静态库仍是 .framework 静态库,最终须要的都是:二进制文件 + .h + 其它资源文件
(2).a 和 .framework 的使用区别
.a 自己是一个二进制文件,须要配上 .h 和 其它资源文件 才能使用
.framework 自己已经包含了 .h 和 其它资源文件,能够直接使用
(3)图片资源的处理
若是静态库中用到了图片资源,通常都放到一个bundle文件中,bundle名字通常跟 .a 或 .framework 名字一致
bundle的建立:新建一个文件夹,修改扩展名为 .bundle 便可,右击bundle文件,显示包内容,就能够往bundle文件中放东西
建议:本身制做的静态库中要用到的图片资源,不建议直接以png的后缀名方式拖到项目中使用,而是推荐使用放到bundle文件中。这样能够避免静态库的图片名和使用静态库的项目中存在的图片产生冲突。
1)新建一个文件夹,把须要打包的资源图片放在里面
2)修改扩展名为 .bundle,敲回车,点击添加。
(4)多文件处理
若是静态库须要暴露出来的 .h 比较多,能够考虑建立一个主头文件(通常 主头文件 和 静态库 同名)
在主头文件中包含全部其余须要暴露出来的 .h 文件
使用静态库时,只须要#import 主头文件
实际上苹果官方就是这么作的,例如:#import <UIKit/UIKit.h>
(5).framework为何既是静态库又是动态库
系统的 .framework 是动态库
咱们本身创建的 .framework 是静态库
(6)静态库中包含了Category(分类)
若是静态库中包含了Category,有时候在使用静态库的工程中会报“方法找不到”的错误(unrecognized selector sent to instance)
解决方案:在使用静态库的工程中配置Other Linker Flags为-ObjC