2012-07-05 87 views
1

我使用核心数据类别。我听过的一些教程,我听过说,类别通常被认为是“坏”的做法。但是因为Objective-C如此动态,所以在其他地方定义方法似乎是完全可以的,尤其是因为只能使用一个类的公共属性。使用类别时我应该注意哪些缺陷?或者有什么理由说类别实际上是不好的做法?我在Core Data中使用它们的原因是,我没有每次重新生成子类时都重写我的加载项方法。什么时候分类不好/危险?

+1

我唯一见过任何反类别注释的时候是用来试图重新定义现有的方法。如果他们在一般情况下不好,我想这会让大量苹果公司的软件工程师感到意外,考虑到他们在SDK和示例代码中的使用频率。 – 2012-07-05 14:13:14

回答

6

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

当你这样做时,你将失去访问原始实现的能力,因为它通常是一个你正在覆盖的私有方法,可能会产生无法预料的效果。

使用类别添加额外方法到任何特定类的对象是伟大的,而且正是他们的目的。像使用核心数据一样使用它们是很好的,因为它确实允许您更改模型并重新生成“vanilla”对象而不会破坏任何额外的代码。

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

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

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

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

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

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

+0

感谢您的回答,执行优先的部分特别有趣。 – Dustin 2012-07-05 14:42:37