我之前在做项目的时候遇到一个问题,解决办法是 在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文件膨胀)。
本文详细介绍了在使用静态库时遇到类被 linker 剔除的问题,提供了两种解决方案:关闭 linker 的优化选项(通过 OtherLinkerFlags 添加 -ObjC 和 -all_load)或在框架类中添加代码引用。并解释了静态库和动态库的区别。
5060

被折叠的 条评论
为什么被折叠?



