Other Linker Flags中添加-ObjC和-all_load 什么意思

来源:互联网 发布:突破公司网络限制 编辑:程序博客网 时间:2024/05/02 01:50

我之前在做项目的时候遇到一个问题,解决办法是 在Other Linker Flags中添加-ObjC和-all_load。

当时不知道是什么意思,加上这句,问题就解决了,现在对这个有点明白了 。

简单的说:这两个参数是 是关闭LingFlag 优化 选项

 这个涉及到 静态库方面的知识。 

什么是静态库?什么是动态库

详细介绍 请移步到 静态库和动态库的区别

下面是介绍

Unknown class MyClass in Interface Builder file.

由于静态框架采用静态链接,linker会剔除所有它认为无用的代码。不幸的是,linker不会检查xib文件,因此如果类是在xib中引用,而没有在O-C代码中引用,linker将从最终的可执行文件中删除类。这是linker的问题,不是框架的问题(当你编译一个静态库时也会发生这个问题)。苹果内置框架不会发生这个问题,因为他们是运行时动态加载的,存在于iOS设备固件中的动态库是不可能被删除的。

有两个解决的办法:


     让框架的最终用户关闭linker的优化选项,通过在他们的项目的Other Linker Flags中添加-ObjC和-all_load

     在框架的另一个类中加一个该类的代码引用。例如,假设你有个MyTextField类,被linker剔除了。假设你还有一个MyViewController,它在xib中使用了MyTextField,MyViewController并没有被剔除。你应该这样做:

在MyTextField中:

+ (void)forceLinkerLoad_ {}

在MyViewController中:

+(void) initialize {     [MyTextField forceLinkerLoad_]; }

他们仍然需要添加-ObjC到linker设置,但不需要强制all_load了。

第2种方法需要你多做一点工作,但却让最终用户避免在使用你的框架时关闭linker优化(关闭linker优化会导致object文件膨胀)。


1 0