【发布时间】:2013-02-23 23:54:56
【问题描述】:
我需要使用类别覆盖方法。我也意识到这样做的危险(这是另一个类中的私有类,没有人会编写另一个覆盖类别方法,因此不能保证未定义的行为)。我见过很多类似的questions,但它们都使用类似这样的方式解决了抑制编译器警告:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
// do your override
#pragma clang diagnostic pop
但是这仍然会留下 linker 警告。在 Xcode 4.6 中,我认为安全的特定覆盖是否可以摆脱它?
这是一个sample GitHub project 说明问题。
【问题讨论】:
-
如果您愿意解释为什么需要它,我们或许可以为您提供替代解决方案。您的示例代码没有向我们展示原因,因为在此示例中并不明显,为什么您不使用子类化。
-
@vikingosegundo 我想替换方法实现,同时仍保留对其超类的访问权限(并发现这是一种比方法调配更优雅的方法)。有关更多信息,请参阅此问题:stackoverflow.com/questions/15291390/… 在那个问题中,我要求提供该问题的替代解决方案。在这里,我只是询问如何抑制实际的链接器警告以供将来参考。
-
我从不认为抑制警告是优雅的。也许它比方法调配更丑……
-
您为什么认为在您的情况下不会保证未定义的行为?来自Avoid Category Method Name Clashes:在Apple文档中:“如果在一个类别中声明的方法的名称与原始类中的方法相同,...,对于使用哪个方法实现的行为未定义在运行时。”
-
你可以试试method swizzle
标签: objective-c clang