iOS开发 - 引入三方静态库文件报错问题

集成三方框架的时候出现了些问题,查了查资料,了解下报错原因及解决方法,稍微总结下。

问题:

集成微信支付的时候崩溃
-[__NSArrayM enqueue:]: unrecognized selector sent to instance 0x174253050

原因:

在集成微信支付时,文件夹中包含一个.a文件。.a文件是一个静态库,链接器只会链接类的符号,并不会链接方法的符号。所以当调用[_NSArrayM enqueue:]方法时,链接器会从Foundation Framework中找到类符号定义并将该库链接进来,而enqueue方法是_NSArrayM扩展(category)的方法,编译器无法链接方法的符号,导致找不到该方法,所以报错。解决这个问题的方法关键就是把静态库中的相关文件都加在进来。

解决方法:

官方文档给的解决方法 方法:Target->Build Settings->Linking 下 Other Linker Flags 项添加-Objc -all_load

添加的字段作用:
-ObjC:链接器会把 Objective-C 的类和分类的所有对象文件全部链接,全部链接后方法符号全部被链接进来,如果类库中只有category没有类的时候这些category还是加载不进来。变通方法就是加入-all_load或者-force_load。
-all_load:链接器把全部的对象文件都链接进来。
-force_load:链接器把你指定的静态链接库中的全部对象文件链接进来,后面要跟需要加载的静态库的路径。

另:

添加-ObjC -all_load字段后,微信支付运行不再报错,但是引用的其他第三方库运行时报错,两个库可能哪里有什么冲突之类,使用-force_load后解决了问题。用到什么就加载什么,这种感觉更好。

参考:
http://www.cnblogs.com/machao/p/5288460.html

你可能感兴趣的:(iOS开发 - 引入三方静态库文件报错问题)