iOS 引用外部静态库(.a文件)时,Category方法无法加载问题

问题:

+[UIImage imageNamedFromBundleWithPNG:]: unrecognized selector sent to class 0x199812698

苹果的解释为 : http://developer.apple.com/library/mac/#qa/qa1490/_index.html

解决方法为:找到 target 的图标,更改其 Other Linker Flags 为: -all_load 或 -force_load
-force_load,后跟随一个文件位置,可以更精确地加载所需文件。

简单点说就是,Objective-C 的动态特性使得需要,为链接器添加一个标签(设置 Other Linker Flags 为 -ObjC)来解决通过 Category 向类添加方法的问题。
但这个标签 -ObjC 在 64 位 和 iOS 中有问题,需要使用 -all_load 或 -force_load。

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


-ObjC

这个flag告诉链接器把库中定义的Objective-C类和Category都加载进来。这样编译之后的app会变大(因为加载了其他的objc代码进来)。但是如果静态库中有类和category的话只有加入这个flag才行。

-all_load

这个flag是专门处理-ObjC的一个bug的。用了-ObjC以后,如果类库中只有category没有类的时候这些category还是加载不进来。变通方法就是加入-all_load或者-force-load。-all_load会强制链接器把目标文件都加载进来,即使没有objc代码。-force_load在xcode3.2后可用。但是-force_load后面必须跟一个只想静态库的路径。

如果项目中同时需要加入多个静态库,有的静态库必须加入-ObjC,而另外的库不需要加入,加入之后报错,看一下出错信息,

duplicate symbol _OBJC_CLASS_$_UMANSBJsonWriter in:

    /Users/tempus-mac/Desktop/CococProject01/CococProject/Class/libMobClickLibrary.a(UMSBJsonWriter.o)

    /Users/tempus-mac/Desktop/CococProject01/CococProject/Class/sdk/libTFTPayPlugin.a(UMSBJsonWriter.o)

ld: 472 duplicate symbols for architecture arm64

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


是一个静态库中包含了另一个静态库,导致有些文件重复了。

你可能感兴趣的:(IOS)