关于缺少类别方法实现的编译时警告

时间:2015-07-02 07:33:36

标签: objective-c xcode clang objective-c-category

在我们的Xcode项目中,我们有多个共享一些常用代码的目标。每个目标仅包括实际使用的源。因此,当我们在目标之间共享的类中使用某些类别方法时,我们需要确保此类别实现也包含在所有目标中。如果我们忘记将类别实现包含在某些目标中,Xcode在编译时或链接时间内不会显示任何警告。手工操作很麻烦。

是否有任何自动方法可确保将类别实施包含在使用它们的目标中?

2 个答案:

答案 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的方法定义"错误。)所以你没有在类别实现中缺少方法,而是缺少类别实现。

我认为这不是什么大问题。您将收到运行时错误而不是编译时错误,只需将类别实现添加到目标。