类别何时不好/危险?

时间:2012-07-05 14:05:59

标签: objective-c objective-c-category

我正在使用Core Data的类别。我读过的一些教程和讲座我听过说类别通常被认为是“坏”的做法。但是因为Objective-C是如此动态,所以在其他地方定义方法似乎是完全可以的,特别是因为只能使用类的公共属性。使用类别时我应该注意哪些陷阱?或者是否有一些理由认为类别实际上是不好的做法?我将它们与Core Data一起使用的原因是每次重新生成子类时我都没有重写我的附加方法。

1 个答案:

答案 0 :(得分:6)

我能想到的唯一“危险”就是当你用它们替​​换原始类中的方法而不是子类化时。

执行此操作时,您将无法访问原始实现,因为它通常是您重写的私有方法,可能会产生无法预料的影响。

使用类别将额外的方法添加到特定类的任何对象非常棒,而且正是它们的用途。正如您所做的那样,将它们用于核心数据是很好的,因为它允许您更改模型并重新生成“vanilla”对象,而不会破坏任何额外的代码。

对于来自Apple的这些文档的@CodaFi的提示:

  

尽管Objective-C语言目前允许您使用类别来覆盖类继承的方法,甚至是类接口中声明的方法,但强烈建议您不这样做。类别不能替代子类。使用类别覆盖方法有几个重大缺点:

     

当类别覆盖继承的方法时,类别中的方法可以像往常一样通过消息调用继承的实现到super。但是,如果某个类别覆盖了类别类中存在的方法,则无法调用原始实现。

     

类别无法可靠地覆盖在同一类的另一个类别中声明的方法。

     

这个问题特别重要,因为许多Cocoa类都是使用类别实现的。您尝试覆盖的框架定义方法本身可能已在类别中实现,因此未定义优先级高的实现。

     

某些类别方法的存在可能会导致所有框架的行为更改。例如,如果您在NSObject上的类别中覆盖windowWillClose:delegate方法,则程序中的所有窗口委托都会使用category方法进行响应。您所有NSWindow实例的行为可能会发生变化。您在框架类上添加的类别可能会导致行为发生神秘变化并导致崩溃。