1)原始方法
-(BOOL) method {
return true;
}
2)覆盖的方法
-(BOOL) method {
NSLog(@"error?");
return true;
}
这是行之有效的还是非法的?
#1 楼
来自Apple文档:尽管Objective-C语言当前允许您使用类别来覆盖类继承的方法,甚至是在类接口中声明的方法,但强烈建议您不要使用这样做。类别不能替代子类。使用类别覆盖方法有几个明显的缺点:
当类别覆盖继承的
方法时,类别
中的方法可以照常,通过给
super
的消息调用继承的实现。
但是,如果类别覆盖了该类别的
类中存在的
方法,则无法调用
原始实现。
一个类别不能可靠地重写在同一类的另一个类别中声明的方法。
由于许多可可类都是使用类别实现。您尝试覆盖的框架定义的方法本身可能已经在一个类别中实现,因此未定义哪个实现优先。
某些类别方法的存在可能会导致所有框架的行为发生变化。 。例如,如果您在NSObject的类别中覆盖
windowWillClose:
委托方法,则程序中的所有窗口委托都将使用category方法进行响应;您所有NSWindow实例的行为可能会更改。您在框架类上添加的类别可能会导致行为的神秘变化并导致崩溃。#2 楼
您可以通过采用“类集群”方法或使用方法混淆技术来做到这一点。否则,两个或更多分类方法的行为是不确定的
#3 楼
旧的文档链接已死;我能找到的最佳替代方法是:Apple文档:避免类别方法名称冲突
因为类别中声明的方法已添加到现有类中,您必须非常注意方法名称。
如果在类别中声明的方法的名称与原始类中的方法的名称相同,或者在同一类别的另一个类别中的方法(甚至是超类),对于在运行时使用哪种方法实现,行为是不确定的。如果您在自己的类中使用类别,则不太可能出现问题,但是在使用类别向标准Cocoa或Cocoa Touch类中添加方法时,可能会导致问题。
苹果使用的触摸较轻,但要点是相同的:您招致灾难,因为无法预测的行为是无声的。
#4 楼
请务必注意,类别也可以用于覆盖基类中的现有方法(例如Car类的drive方法),但绝对不要这样做。问题在于类别是扁平的组织结构。如果您覆盖Car + Maintenance.m中的现有方法,然后决定要使用另一个类别再次更改其行为,那么Objective-C将无法知道要使用哪种实现。在这种情况下,子类化几乎总是一个更好的选择。在本教程中,http://rypress.com/tutorials/objective-c/categories
评论
谢谢,但我已经知道了。我只是想知道我的案子是否合法。我的案子与文件有所不同。 :)
–retix
2011年3月11日在12:16
为什么不同?该文档说,如果原始方法不在类别中,但强烈建议不要这样做,那是合法的。那你就可以做...
–贝诺
2011年3月11日12:29
谢谢你的建议。我的语言不好。我收到了你的新消息。
–retix
2011年3月11日13:52
在超类的Category中声明和实现的Category方法中重写是否正确?
– BergP
13年3月19日在13:59
链接已断开,这是新版本吗? developer.apple.com/library/ios/documentation/Cocoa/Conceptual/…
– RndmTsk
15年3月3日在21:31