为什么要用-all_load&-ObjC


  • 技术问题发到问答:我知道,我仍旧要在论坛继续发布问题
为了减少工作量复用部分代码,于是乎我们开始选择重构整个项目,把可以公用的代码放在一起打包成一个
静态库子项目在其他的项目中使用。介绍这部分内容的文章在网上很多,各位可以G一下细看。

但是每次在加入静态库的时候都会在other linker flag里设置两个值:-all_load和-ObjC。
很奇怪为什么要这样做,而且有的时候什么都不设置也不影响静态库的使用。
所有使用了这个静态库的项目都没有出现任何的问题,即使不设置那两个flag值。

于是拜求G大神,终于找到了结果。
关于-ObjC的:
引用 
This flag causes the linker to load every object file in the library that defines an Objective-C class or category. 
While this option will typically result in a larger executable (due to additional object code loaded into the application), 
it will allow the successful creation of effective Objective-C static libraries that contain categories on existing classes.

翻译过来是:
引用 

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


关于-all_load的
引用 
IMPORTANT: For 64-bit and iPhone OS applications, there is a linker bug that prevents -ObjC from loading objects files from static libraries that contain only categories and no classes. 
The workaround is to use the -all_load or -force_load flags. -all_load forces the linker to load all object files from every archive it sees, even those without Objective-C code.
-force_load is available in Xcode 3.2 and later. It allows finer grain control of archive loading. Each -force_load option must be followed by a path to an archive, 
and every object file in that archive will be loaded.


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

读了以上你明白了吧。
无论如何还是把那两个flag的值都加上吧。这样可以保证你哪天突发奇想加了一堆category什么的oc牛X语法也不至于项目崩溃。

亲们,觉得有价值就顶起来吧 
阅读更多
想对作者说点什么? 我来说一句

struts spring hibernate 面试总结.doc

2009年11月17日 39KB 下载

Hibernate工作原理及为什么要用

2013年05月05日 68KB 下载

VLAN技术白皮书(管理)

2009年04月21日 33KB 下载

三大框架工作原理总结

2014年04月24日 4KB 下载

COM技术入门基础知识

2011年09月08日 323KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭