如果是坏的类别/危险?(When are categories bad/dangerous?)

2019-10-16 23:30发布

我使用的是核心数据的类别。 一些我听过说,类别通常被认为是“坏”的做法我已经阅读教程和讲座。 但由于Objective-C的如此蓬勃,似乎完全没到别的地方定义方法,尤其是因为只有一类的公共属性都可以使用。 什么是我应该寻找出陷阱使用类别时? 或者是有一些原因,类别实际上是不好的做法? 我使用他们的原因与核心数据是如此,我没有重写我的每一次我重新生成子类时附加的方法。

Answer 1:

唯一的“危险”我能想到的是,当你用它们来替换原有的类,而不是子类的方法。

如果这样做,你失去访问原始的实现,它,因为它通常是要覆盖一个私有方法的能力,可能有不可预料的后果。

利用类别进行额外的方法添加到特定类的任何对象是伟大的,正是他们为。 使用他们的核心数据,因为你正在做的,是好的,因为它允许您更改模型并重新生成“香草”的对象,而不破坏任何额外的代码。

帽子的提示来@CodaFi该位从苹果的文档:

虽然Objective-C语言目前允许你使用类别覆盖方法的类继承,甚至可以在类接口声明的方法,因此强烈建议您这样做劝阻。 类别是不是一个子类的替代品。 有使用类别覆盖方法的几个显著的缺点:

当一个类别覆盖继承的方法,该种类的该方法可以,像往常一样,通过一个消息给超级调用继承实现。 但是,如果一个类覆盖存在于类的类中的方法,有没有办法来调用原始的实现。

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

这个问题是特别重要的意义,因为许多Cocoa类的使用类别来实现。 您尝试重写一个框架定义的方法本身可能已经在一个类别中实现,所以它的实现需要是没有定义的优先级。

一些类方法的存在很可能会导致在所有框架行为的变化。 例如,如果您覆盖windowWillClose:委托方法在NSObject的一个类别,在你的程序,然后使用类中的方法应对所有窗口的代表; NSWindow的所有实例的行为可能会改变。 你在一个框架类添加分类可能会导致行为的变化神秘而导致崩溃。



文章来源: When are categories bad/dangerous?