编译时警告:缺少类别方法实现

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

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

2个回答

2
所描述的行为是有意为之的,如果更改会破坏许多现有代码。
在正式协议出现之前,需要声明未定义的方法。这是为了可选方法,即声明委托API。通常的技术是声明一个所谓的非正式协议,它由NSObject上的类别组成,但从未实现过。
但是,如果您有一个类别实现,当然会根据类别接口检查其完整性。(否则,您将收到“找不到X的方法定义”错误。)因此,您在类别实现中没有缺少方法,而是缺少类别实现。
我认为这不是什么大问题。您将获得运行时错误而不是编译时错误,并将简单地将类别实现添加到目标中。

2
谢谢,我明白为什么它能这样工作。但我真的希望有一些黑科技、诀窍或第三方脚本,在链接时检查这个问题。 - kolyuchiy
1
恭敬地说,我认为这可能是一个大问题。运行时错误意味着在非常特定的情况下用户会遇到崩溃。根据不同的因素,开发人员可能很长时间都不知道这个问题。随着项目变得越来越复杂,有更多的目标和类别,这可能成为崩溃的潜在来源。不幸的是,除了不将类别拆分为单独的文件(适用的情况下),我不知道还能做什么。 - user3099609
我们正在谈论一个方法调用。希望在发布软件之前测试其每个路径(否则你会有更大的问题)。“也许在运行时会发生一些奇怪的事情”只是一个神话。这不是导致软件崩溃的原因。请查看您的崩溃日志。 - Amin Negm-Awad

2

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

如果链接器发现定义它们的文件被使用,它们才会被链接(这曾经是常见的 bug 来源)。

您可以在链接器上使用一个特殊的标志:'-all_load' 和 '-ObjC' 在“构建设置/链接/其他链接标志”中。

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

另外从这个讨论中得知:

-all_load 和 -force_load 告诉链接器在最终可执行文件中链接整个静态存档库,即使链接器认为存档库的某些部分未使用。

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

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

我需要在我的应用程序开始时调用它:

 linkWithNBLogClass();

通过控制台的反馈,我可以确定我的模块已经加载并准备好被使用了。


这并没有解决他的问题,只是使-respondsToSelector:在运行时更加安全。(如果我理解他的意思正确的话。) - Amin Negm-Awad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接