在我们的Xcode项目中,我们有多个共享一些常用代码的目标。每个目标仅包括实际使用的源。因此,当我们在目标之间共享的类中使用某些类别方法时,我们需要确保此类别实现也包含在所有目标中。如果我们忘记将类别实现包含在某些目标中,Xcode在编译时或链接时间内不会显示任何警告。手工操作很麻烦。
是否有任何自动方法可确保将类别实施包含在使用它们的目标中?
答案 0 :(得分:2)
类别不会自动链接到最终二进制文件。
如果链接器找到使用它们的文件,它们就会链接起来(以前这是一个常量错误的来源)。
您可以做的是在链接器上使用特殊标志:' -all_load'和' -ObjC'在构建设置/链接/其他链接器标志
-ObjC加载实现Objective-C类或类别的静态归档库的所有成员。
从此discussion:
-all_load和-force_load告诉链接器链接最终可执行文件中的整个静态存档,即使链接器认为该部分也是如此 存档未使用。
我用来强制链接模块的另一种方法是在文件中放置一个C函数:
void _linkWithNBLogClass(void)
{
NSLog(@"%s", __FUNCTION__);
}
并在我的应用程序开始时调用它:
linkWithNBLogClass();
这样,通过控制台反馈,我确定我的模块已加载并准备好使用。
答案 1 :(得分:1)
所描述的行为符合预期,如果更改,现有的许多代码都会中断。
在正式协议之前,需要在不定义方法的情况下声明方法。这是可选方法,即。即用于声明委托API。通常的技术是声明一个所谓的informal protocol,由NSObject
上的一个从未实现的类别组成。
但是如果你有一个类别实现,当然它的完整性是根据类别界面来检查的。 (否则你会得到"找不到X的方法定义"错误。)所以你没有在类别实现中缺少方法,而是缺少类别实现。
我认为这不是什么大问题。您将收到运行时错误而不是编译时错误,只需将类别实现添加到目标。