2015-07-02 44 views
3

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

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

回答

2

类别不会自动链接到最终的二进制文件。

如果链接器找到定义它们的文件(这是前一个常见错误的来源),则链接它们。

你可以做什么是链接器使用一个特殊的标志:在构建设置“-all_load”和“-ObjC” /链接/其他连接标志

-ObjC负载静态归档库中的所有成员实现Objective-C类或类别。

而从这个discussion

-all_load和-force_load告诉链接到整个静态档案最终的可执行链接,即使链接器认为存档的 部分未使用。

另一种方法我用强制链接模块是把C函数的文件中:

void _linkWithNBLogClass(void) 
{ 
    NSLog(@"%s", __FUNCTION__); 
} 

,并在我的应用程序开始调用它:

linkWithNBLogClass(); 

这方式,通过控制台反馈,我确定我的模块已加载并准备好使用。

+0

这并不能解决他的问题,只是简单地使'-respondsToSelector:'运行时安全。 (如果我得到他的正确。) –

1

所描述的行为与预期的一样,如果更改,大多数现有代码都会中断。

在正式协议之前,需要声明方法而不定义它们。这是可选的方法,我。即用于声明委托API。通常的技术是宣布一个所谓的informal protocol,由NSObject这个从未实现的类别组成。

但是,如果你有一个类别的实现,当然它的完整性检查对类别界面。 (否则你会得到一个“找不到X的方法定义”的错误。)因此,在类别实现中没有缺少方法,但缺少类别实现。

我不认为这是一件大事。您将得到一个运行时错误而不是编译时错误,只需将类实现添加到目标。

+0

谢谢,我明白了为什么它这样工作。但我真的希望有一些黑客或诡计或第三方脚本在链接时检查这一点。 – kolyuchiy