静态库的制作

概念

库是程序代码的集合,是共享程序代码的一种方式
根据源代码的公开情况,库可以分为2种类型

开源库

公开源代码,能看到具体实现,比如SDWebImage、AFNetworking。。。

闭源库

不公开源代码,是经过编译后的二进制文件,看不到具体实现
主要分为:静态库、动态库
静态库:.a 和 .framework
动态库:.dylib 和 .framework

静态库和动态库在使用上的区别
静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝(左图所示)
动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存(右图所示)

PS:项目中如果使用了自制的动态库,不能被上传到AppStore

制作.a静态库

1.Xcode ->Framework&Library(iOS) -> Coca Touch Static Library

2.添加需要制作的.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

 

posted @ 2015-08-30 23:24  shanhua  阅读(202)  评论(0编辑  收藏  举报