【问题标题】:Suppress linker warning: "Meta method X in category from Y overrides method from class in Z"禁止链接器警告:“来自 Y 的类别中的元方法 X 覆盖来自 Z 中的类的方法”
【发布时间】:2013-01-02 21:15:29
【问题描述】:

我有意使用类别来覆盖我知道已在主类上实现的方法。我知道这通常是设计薄弱的标志——请不要讲课——但在这种情况下我不能干净地继承子类。我知道swizzling 也可能是一种选择。

但是现在,我怎样才能抑制这个警告呢? llvm 抛出一个我可以禁用的编译器警告 (diagnostic ignored "-Wobjc-protocol-method-implementation")。但随后链接器也会抱怨。

This asks a similar question but was looking for a different answer.我如何告诉链接器不要抱怨?

谢谢。

【问题讨论】:

  • 您可能无法抑制警告,因为实际上它应该是一个硬错误。
  • @bbum:谢谢。你觉得这个说法对吗? “这是一个严厉的警告,因为重要的是要防止人们通过意外这样做,从而巧妙地搞砸一些事情。类别用于全局增强功能,子类用于扩展或在某些情况下 override 功能。如果必须在没有子类化的情况下进行覆盖,则 swizzling 是一种更有意且更少(对于“更少”的定义)脆弱的方式。”
  • 我会说 swizzling 是精确的,但并没有那么脆弱,因为您仍然假设您的实现与原始的内部实现细节完全兼容(即使您确实调用了原始,仍然存在大量假设)。
  • 不是骗子,真的,因为问题是关于 linker 而不是编译器。另一个问题并非特定于编译器,但大多数答案都是。你不能用编译指示或-W来解决它。

标签: ios objective-c linker objective-c-category


【解决方案1】:

很遗憾,没有好的答案。

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

更高级别的解决方法是将链接器的输出通过grep -v 传递。该解决方案的细节往往在很大程度上取决于您的 shell 和构建系统。

【讨论】:

    猜你喜欢
    • 2012-07-25
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    相关资源
    最近更新 更多