抑制链接器警告: "类别 Y 中的元方法 X 覆盖了 Z 类中的方法"

7
我有意使用一个类别来覆盖我知道已经在主类上实现的方法。我知道这通常是设计不佳的标志--请不要讲道理--但在这种情况下,我无法干净地进行子类化。我知道swizzling也可以是一种选择。
但现在,我该如何抑制此警告?llvm会抛出一个编译器警告,我可以禁用它(diagnostic ignored "-Wobjc-protocol-method-implementation")。但是链接器也会抱怨。 这个问题类似,但是寻找不同的答案。我如何告诉链接器不要抱怨?
谢谢。

您可能无法抑制警告,因为实际上它应该是一个严格的错误。 - bbum
@bbum:谢谢。你觉得这个说法正确吗?“这是一个严格的警告,因为防止人们意外地这样做并从而悄悄地搞砸某些东西非常重要。类别存在于全局增强功能,子类存在于扩展或在某些情况下覆盖功能。如果必须在不使用子类的情况下进行覆盖,则交换方法是更有意图且不那么(根据某种定义)脆弱的方式。” - Ben Zotto
2
不是重复的问题,因为这个问题是关于链接器而不是编译器的。另一个问题并不特定于编译器,但大多数答案都是。你不能用指示符或-W解决它。 - paulmelnikow
@bbum,既然您主张通过链接器错误完全禁止使用此机制的家长式(咳嗽)政策,那么您将如何覆盖例如测试框架的方法?比如说,我想在规范和应用程序中为基类上定义的抽象方法提供不同的实现。如果有更好的方法不令人痛苦或笨拙,我很乐意使用它,但这似乎并不是那么可怕;实现细节在内部受到控制,混淆算作“相当笨拙”... - tooluser
这是suppress instance method override linker warning framework xcode的副本。有几种不同的链接器标志方法可以将其消除,尽管正如bbum所提到的,最好不要在生产代码中使用任何一种方法。但是对于测试框架,可以使用它们。 - Carl Lindberg
显示剩余2条评论
1个回答

1

很遗憾,没有好的答案。

唯一基于链接器的解决方案是在链接时传递-Wl,-w,也就是告诉Clang将-w选项传递给链接器。这将抑制所有链接器警告,可能包括您仍希望看到的警告。

更高级的解决方法是通过grep -v筛选链接器的输出。该解决方案的详细信息往往会严重依赖于您的shell和构建系统。


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