如果我们包含任何外部库或框架,我们在 Xcode 中项目设置的其他链接器标志中包含“-ObjC”,任何人都可以告诉我它的原因是什么以及如果我们包含它它会做什么。
提前致谢..
如果我们包含任何外部库或框架,我们在 Xcode 中项目设置的其他链接器标志中包含“-ObjC”,任何人都可以告诉我它的原因是什么以及如果我们包含它它会做什么。
提前致谢..
Apple 的 QA1490 对此进行了很好的解释。
关键摘录:
Objective-C 没有为每个函数(或 Objective-C 中的方法)定义链接器符号 - 相反,链接器符号只为每个类生成。
...
要解决此问题,针对静态库的目标链接必须将 -ObjC 选项传递给链接器。此标志使链接器加载定义了 Objective-C 类或类别的库中的每个目标文件
类别是此标志的最知名用例(正如 Apple 的 QA1490 解释的那样),但它们并不是需要此标志的唯一原因。
由于 Objective-C 是一种使事情成为NSClassFromString()
可能的动态语言,因此 C 链接器仅包含实际使用的符号(并丢弃所有其他符号)的标准行为不起作用,因为无法确定某些符号是否实际上是以一些间接方式使用,例如连接字符串然后调用NSSelectorFromString
or NSClassFromString
。
以 xib/nib 文件为例:它们不参与链接阶段,但它们可能会实例化除此 nib 文件之外的任何东西都没有引用的库类。如果链接器将这些类作为未使用的类丢弃,则 nib 无法加载和正常工作。
确保没有丢失的唯一方法是在链接时包含库中的每个 Obj-C 类,而这个标志就是这样做的。
-ObjC
链接器标志使链接器加载定义Objective-C类或类别的库中的任何目标文件。