iOS 引用外部静态库(.a文件)时或打包.a时,Category方法无法调用。崩溃

 

我的这个是MJRefresh,学习打.a包
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITableView setMj_footer:]: unrecognized selector sent to instance 0x7fa37a871000'

结果这个问题如下设置:
把other linker flags 设置成 -all_load

 

如果,第三库中没有 category,Other Linker Flags 无需设置
如果,第三方库中有 category,需要设置为 -ObjC
如果,某些 Xcode 版本中,出现问题,修改设置为 -all_load

 

如果有文件重复的错误,可以把多余的.m文件去掉

iOS 引用外部静态库(.a文件)时或打包.a时,Category方法无法调用。崩溃_第1张图片

 

关于这几个参数的介绍

Targets选项下有Other linker flags的设置,用来填写XCode的链接器参数,如:-ObjC -all_load -force_load等。
还记得我们在学习C程序的时候,从C代码到可执行文件经历的步骤是:
源代码 > 预处理器 > 编译器 > 汇编器 > 机器码 > 链接器 > 可执行文件
在 最后一步需要把.o文件和C语言运行库链接起来,这时候需要用到ld命令。源文件经过一系列处理以后,会生成对应的.obj文件,然后一个项目必然会有许 多.obj文件,并且这些文件之间会有各种各样的联系,例如函数调用。链接器做的事就是把这些目标文件和所用的一些库链接在一起形成一个完整的可执行文 件。
如果要详细研究链接器做了什么,请看:http://www.dutor.net/index.php/2012/02/what-linkers-do/

那么,Other linker flags设置的值实际上就是ld命令执行时后面所加的参数。

下面逐个介绍3个常用参数:
-ObjC:加了这个参数后,链接器就会把静态库中所有的Objective-C类和分类都加载到最后的可执行文件中
-all_load: 会让链接器把所有找到的目标文件都加载到可执行文件中,但是千万不要随便使用这个参数!假如你使用了不止一个静态库文件,然后又使用了这个参数,那么你很 有可能会遇到ld: duplicate symbol错误,因为不同的库文件里面可能会有相同的目标文件,所以建议在遇到-ObjC失效的情况下使用-force_load参数。
-force_load:所做的事情跟-all_load其实是一样的,但是-force_load需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载

 

 真机和模拟器都可以使用.a文件可以合并成为一个.a文件 使用终端合成具体方法如下:

终端代码如下:
lipo -create SQY/iOS/iphoneos/libGamePlusAPI.a SQY/iOS/iphonesimulator/libGamePlusAPI.a  -output SQY/iOS/libGamePus.a
其中SQY/iOS/iphoneos/libGamePlusAPI.a //为真机库。  
 SQY/iOS/iphonesimulator/libGamePlusAPI.a //为模拟器库  -output SQY/iOS/libGamePus.a //为两个合并后存放的路径
关于路径生成,只需直接把.a拖拽到终端即可生成

 

转载于:https://www.cnblogs.com/jgl-blog/p/5765427.html

你可能感兴趣的:(iOS 引用外部静态库(.a文件)时或打包.a时,Category方法无法调用。崩溃)