静态库(.a文件)的封装

注意:封装静态库时要注意的地方:

1、如果要封装的文件中有派生类,比如NSString+helper这样的写法,那就需要把TARGETS->Build Settings->Linking->Other Linker Flags的属性设置为-ObjC或者-all_load(注意是在打包SDK的项目中添加),否则它会一直奔溃,并且还一直奔溃在你正在使用中的派生类里边,接下来,补充一下,静态库的封装方法。

2、创建项目后赶紧把PROJECT->Info->Deployment Target->iOS Deployment Target的目标版本给换成自己要的版本,以免到时候弄个乌龙出来

image

一、创建项目

创建静态库跟普通创建项目有点不一样,创建之时,他要选择Framework &Library中的Cocoa Touch Static Library

image

二、把你要封装的文件拖进项目,然后就开始开放接口了

开放接口的方法:TARGETS->点击Target Dependencies左上角的"+",再出现的弹框中选择New Headers Phase,此时在Target Dependencies最底部便能出现Headers了,将SDK中的所有.h文件添加进入Headers->Project,然后把要开放的.h文件从Project中拖进Public中,实际上自己在里边直接创建、编写SDK文件也是没问题的,至此便达成了开放SDK接口的目的。

image
image
image

如果你有什么不方便开放的东西或者给予用户一点点开放空间,就创建一个类吧,但是别把它添加进入封装之列,我这边是预留了一个类one_analysis.h,等到SDK出来之后我会直接在Demo中把它添加进去

image

三、静态库模式

静态库分为四种模式:1、真机Debug模式;

                                2、真机Release模式;

                               3、模拟器Debug模式;

                               4、模拟器Release模式

1、选机型

选择真机模式的时候机器要选择Generic iOS Device,这个是真机通用型,可以用于所有真机,模拟器就可以在iOS Simulators中随便选了

image

2、选模式

选模式即在Edit Scheme->Info的Bulid Configuration中选择对应的Debug/Release

image

3、生成不同模式的静态库文件

当你在模拟器时选了Debug,然后Command+B(或者Command+R),运行成功后,项目自带文件夹Products中的.a文件就会由红色变为黑色,这就意味着静态库已经生成了。光标指向.a文件,右键 show in Finder就可以找到.a文件了

image
image

四、合并静态库

一般来说,为了节省内存,以上四种模式就够用了,但是总有奇怪的需求:要合并静态库,增加自己的应用大小。

我现在还只能做:通用Debug = 模拟器Debug+真机Debug

                         通用Release = 模拟器Release+真机Release

合并需要在终端进行,以Debug为例,公式是这样的lipo -create 模拟器Debug静态库地址+真机Debug静态库地址 -output 存放通用静态库的文件夹地址+通用静态库名

image

五、组合SDK

简单的说就是静态库文件+接口+用户可操作的.h、.m文件

image

最后说一句,我写博客仅仅是为了自己做笔记,但并不会天天盯着它看,所以如果您提了什么问题而我很久没有回应,请见谅!

后记:

2017年05月17日:经过实验测得,当文件被添加进入你用来打包的项目中时,就已经被默认为封装在静态库中了,并不是说在Headers中添加了.h文件中才算添加进了静态库中,所以,如果有一些要开放的源码,就不要放在打包的项目中,否则在导入了静态库的项目中会报错,

实际场景:自己封装的静态库中包含AFNetworking等著名的第三方框架,但是接入你的SDK的公司也使用了这类框架,然后就会提示下列错误


clang: error: linker command failed with exit code 1 (use -v to see invocation)

更加尴尬的是:因为重复的文件是在静态库中,报错信息并不能点击指明报错的文件

对此:暂时使用的方法是:第三方文件不要放在打包的项目中,然后添加第三方库的时候,

取消Add to targets的选项(此方法的弊端:当两者的第三方库有差别时,比如2.0的AFNetworking有AFHTTPRequestOperationManager,而3.0的AFNetworking却是没有的,而刚好你使用的2.0并创建了其实某个类的category,然后接入方使用的3.0中由于没有该类,所以category就无从说起了,然后你就尴尬了)

image

二、设想的第二种方案:修改自己的库中与接入方冲突的方法,如果是在不放心,就把冲突的文件名也改掉

你可能感兴趣的:(静态库(.a文件)的封装)