我使用核心数据类别。我听过的一些教程,我听过说,类别通常被认为是“坏”的做法。但是因为Objective-C如此动态,所以在其他地方定义方法似乎是完全可以的,尤其是因为只能使用一个类的公共属性。使用类别时我应该注意哪些缺陷?或者有什么理由说类别实际上是不好的做法?我在Core Data中使用它们的原因是,我没有每次重新生成子类时都重写我的加载项方法。什么时候分类不好/危险?
回答
我能想到的唯一的“危险”是当你用它们替换原始类中的方法而不是子类时。
当你这样做时,你将失去访问原始实现的能力,因为它通常是一个你正在覆盖的私有方法,可能会产生无法预料的效果。
使用类别添加额外方法到任何特定类的对象是伟大的,而且正是他们的目的。像使用核心数据一样使用它们是很好的,因为它确实允许您更改模型并重新生成“vanilla”对象而不会破坏任何额外的代码。
提示的帽子,以@CodaFi从苹果该位文档:
虽然Objective-C语言目前允许你使用一个类来覆盖声明的方法的类继承,甚至方法类接口,你强烈建议不要这样做。一个类别不能代替一个子类。使用类别覆盖方法有几个明显的缺陷:
当类别重写继承的方法时,类别中的方法可以像往常一样通过消息调用继承的实现,以超级。但是,如果某个类别覆盖该类别中存在的方法,则无法调用原始实现。
类别不能可靠地覆盖在同一类的另一个类别中声明的方法。
这个问题特别重要,因为许多Cocoa类都是使用类别实现的。您尝试覆盖的框架定义方法本身可能已在类别中实现,因此没有定义哪个实现优先。
某些类别方法的存在可能会导致跨所有框架的行为更改。例如,如果覆盖NSObject类别中的windowWillClose:delegate方法,则程序中的所有窗口委托都会使用类别方法进行响应; NSWindow的所有实例的行为可能会发生变化。您添加到框架类上的类别可能会导致行为中的神秘变化并导致崩溃。
感谢您的回答,执行优先的部分特别有趣。 – Dustin 2012-07-05 14:42:37
- 1. 什么时候可以考虑使用危险的SetInnerHTML()安全?
- 2. 网络爬虫遇到什么危险?
- 3. 为什么Thread.stop()如此危险
- 4. 使用svn有什么危险?
- 5. 什么是从取回HTML的危险
- 6. coxph.detail $危险的公式是什么?
- 7. 什么时候不使用RelativeLayout更好?
- 8. 为什么原始数组的多态类型是危险的
- 9. 返回原始类型有什么危险?
- 10. Ajax的危险
- 11. 为什么reinterpret_cast的仍然是在使用时有危险
- 12. 什么时候子类UITableView?
- 13. 什么时候去接口,什么时候去抽象类
- 14. 子类UIViewController,什么时候不到
- 15. 是jQuery.html()危险吗?
- 16. Unicode输入危险
- 17. 潜在危险Request.Path(:)
- 18. 我什么时候需要分配财产,什么时候不需要?
- 19. 在Javascript中向Object.prototype添加方法有什么好处和危险?
- 20. 在Python中切分危险的操作?
- 21. 什么时候最好用C++模板?
- 22. 什么时候是Malloc的好主意?
- 23. 什么时候比数组好?
- 24. 什么时候最好做NSManagedObjectContext保存?
- 25. MS SQL Server - 什么时候CURSOR好?
- 26. 什么时候应该使用AWS,什么时候不使用
- 27. Application.DoEvents,什么时候需要,什么时候不需要?
- 28. intn_t什么时候使用它,什么时候不使用
- 29. 什么时候加入名字,什么时候不加入?
- 30. 什么时候使用GWT,什么时候不需要
我唯一见过任何反类别注释的时候是用来试图重新定义现有的方法。如果他们在一般情况下不好,我想这会让大量苹果公司的软件工程师感到意外,考虑到他们在SDK和示例代码中的使用频率。 – 2012-07-05 14:13:14