编译参数-ObjC及-all_load的说明

编译参数-ObjC及-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后面必须跟一个静态库的路径

一些第三方库里对系统的类添加了 category

这时,就需要使用编译参数-ObjC ,这样第三方库中对系统类作的扩展方法才能在工程中使用

但是使用-ObjC 后,会产生两个问题 :

1.undefined symbols

2.duplicate symbols

undefined symbols 说明工程中没有引入第三方引用的库

如果不加-ObjC 参数,则在编译时不会出错,但在运行时用到了没有引用库的方法,则系统会崩溃
这个问题好解决,只要找到缺的库,引入工程就可以了

duplicate symbols 的问题就不好解决了,说明第三方库中的类名和工程中的类名,或其他第三方库中的类名重名了.

最常见的比如Reachability 这个类.如果第三方库中引用了,自己的工程中也引用了.就会报duplicate symbols

如果引用的第三方库没有源代码,就只能将自己工程中的重名类重命名了

应对上面的问题,如果自己要制作一个库的话,要注意两点:

1.避免对系统类加category 这样,别人用到你的库时,不加ObjC参数也可以用你的库

2.如果库中用到了其它的第三方的源代码,尤其是用的比较普遍的,如 Reachability ,一定一定要对这些类重命名,最常见的做法是给类加个前缀,以避免别人用你的库时,产生duplicate symbols 的问题

你可能感兴趣的:(编译参数-ObjC及-all_load的说明)