1

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

4

1 回答 1

6

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

这样做时,您将失去访问原始实现的能力,因为它通常是您要覆盖的私有方法,因此可能会产生无法预料的影响。

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

向@CodaFi 致敬,以获取来自苹果的这一点文档:

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

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

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

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

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

于 2012-07-05T14:13:36.173 回答