静态库的制作
2015-08-30 23:24
239 查看
概念
库是程序代码的集合,是共享程序代码的一种方式根据源代码的公开情况,库可以分为2种类型
开源库
公开源代码,能看到具体实现,比如SDWebImage、AFNetworking。。。闭源库
不公开源代码,是经过编译后的二进制文件,看不到具体实现主要分为:静态库、动态库
静态库:.a 和 .framework
动态库:.dylib 和 .framework
静态库和动态库在使用上的区别
静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝(左图所示)
动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存(右图所示)
PS:项目中如果使用了自制的动态库,不能被上传到AppStore
制作.a静态库
1.Xcode ->Framework&Library(iOS) -> Coca Touch Static Library2.添加需要制作的.m文件
3.添加需要暴露出来的.h文件
4.选择模拟器或真机 打包
模拟器(X86_64)和真机(armv7,arm64...)打包出来的.a文件支持不同的CPU架构
用 lipo –info libXXX.a 可以查看 .a 支持的CPU类型
可以合并模拟器和真机的.a文件使之同时支持模拟器和真机上运行
lipo -create Debug-iphoneos/libXXX.a Debug-iphonesimulator/libXXX.a -output libXXX.a
(PS:若.a有自己的资源文件,一般制作成Bundle 最终交付的为:.a + .h + Bundle
合并.a的坏处,如果静态库太大,合并打包后,会非常大,因此很多第三方的静态库的.a是区分版本的今后在使用.a时一定注意版本
)
制作.framework
》 Xcode6 之前没有模板制作framework,必须自己手工制作,很是繁琐。可以借助github上的开源模板制作 https://github.com/kstenerud/iOS-Universal-Framework (在终端下进入iOS-Universal-Framework/Fake Framework文件夹,执行指令./install.sh安装模板)
》Xcode6后,可以直接用Xcode提供的模板
Xcode ->Framework&Library(iOS) -> Coca Touch Dynamic Library
(PS: 系统模板生成的framework是动态库,appstore是不允许有自制的动态framework的,因此需要修改成静态framework
选中framework在Build Setting->Linking->Mack-O Type 中选择Static Library即可转为静态framework
)
制作静态注意点
0).a和.framework区别.a 本身是一个二进制文件,需要配上 .h 和 其它资源文件 才能使用
.framework 本身已经包含了 .h 和 其它资源文件,可以直接使用
(图片资源的处理
如果静态库中用到了图片资源,一般都放到一个bundle文件中,bundle名字一般跟 .a 或 .framework 名字一致
bundle的创建:新建一个文件夹,修改扩展名为 .bundle 即可,右击bundle文件,显示包内容,就可以往bundle文件中放东西
)
1)多文件处理
如果静态库需要暴露出来的 .h 比较多,可以考虑创建一个主头文件(一般 主头文件 和 静态库 同名)
在主头文件中包含所有其他需要暴露出来的 .h 文件
使用静态库时,只需要#import 主头文件(实际上苹果官方就是这么做的,例如:#import <UIKit/UIKit.h>)
2)静态库中包含了Category
如果静态库中包含了Category,有时候在使用静态库的工程中会报“方法找不到”的错误(unrecognized selector sent to instance)
解决方案:在使用静态库的工程中配置Other Linker Flags为-ObjC
相关文章推荐
- IntelliJ IDEA 在使用manven后的纠结(每次修改代码都要重启tomcat才能看效果吗?),请各位大侠来看看问题
- Java多线程之可见性与原子性——synchronized VS volatile
- Struts2 框架的意义
- 如何简单地在浏览器中使用阿里云的文件上传功能?
- 一致性哈希算法及其在分布式系统中的应用 作者 张洋
- HDU 1874 畅通工程续
- jdk7之java.lang.invoke.MethodHandle
- Sql-性能优化
- 【写一个自己的js库】 4.完善跨浏览器事件操作
- 理解Load Average做好压力测试
- display the contents of a PEM formatted certificate under Linux, using openssl:
- 如何跨 frame 获取页面元素和函数
- hdu 3524 Perfect Squares 推公式求逆元
- 问题
- 3D图像算法
- svg画大白
- 数据库连接全接触
- UML序列图总结
- mysql authorization check
- 通过String获取字符数组