在Objective-C中使用类别重写方法
我是否可以使用类类别重写已使用类别实现的方法?像这样: 1) 原始方法在Objective-C中使用类别重写方法,objective-c,categories,Objective C,Categories,我是否可以使用类类别重写已使用类别实现的方法?像这样: 1) 原始方法 -(BOOL) method { return true; } 2) 重写方法 -(BOOL) method { NSLog(@"error?"); return true; } 这是有效的还是非法的?来自: 尽管Objective-C语言目前允许您使用类别覆盖类继承的方法、甚至类接口中声明的方法,但强烈建议您不要这样做。类别不能代替子类。使用类别覆盖方法有几个明显的缺点: 当类别覆盖继承的 方法,类别
-(BOOL) method {
return true;
}
2) 重写方法
-(BOOL) method {
NSLog(@"error?");
return true;
}
这是有效的还是非法的?来自:
尽管Objective-C语言目前允许您使用类别覆盖类继承的方法、甚至类接口中声明的方法,但强烈建议您不要这样做。类别不能代替子类。使用类别覆盖方法有几个明显的缺点:
- 当类别覆盖继承的
方法,类别中的方法
可以像往常一样调用继承的
通过发送至
的消息实施。 但是,如果类别覆盖了 方法中存在的 类,则无法调用 原始实施super
- 一个类别不能可靠地重写在同一类别的另一个类别中声明的方法。 这个问题特别重要,因为许多Cocoa类都是使用categories实现的。您试图覆盖的框架定义的方法本身可能已在类别中实现,因此未定义哪个实现优先
- 某些类别方法的存在可能会导致所有框架的行为改变。例如,如果覆盖NSObject上某个类别中的
委托方法,则程序中的所有窗口委托都将使用该类别方法进行响应;NSWindow的所有实例的行为可能会更改。添加到框架类上的类别可能会导致行为上的神秘变化并导致崩溃窗口将关闭:
您可以通过调整方法或使用技术来做到这一点
否则,两个或多个分类方法的行为是需要注意的是,一个类别也可以用于重写基类中的现有方法(例如,Car类的drive方法),但您永远不应该这样做。问题在于类别是一个扁平的组织结构。如果您重写Car+Maintenance.m中的现有方法,然后决定使用另一个类别再次更改其行为,则Objective-C无法知道要使用哪个实现。在这种情况下,子类化几乎总是一个更好的选择
从本教程中,旧文档链接已失效;我能找到的最好的替代品是这里: 避免类别方法名称冲突 由于类别中声明的方法是添加到现有类中的,因此需要非常小心方法名称 如果类别中声明的方法的名称与原始类中的方法相同,或者与同一类(甚至是超类)中另一个类别中的方法相同,则在运行时使用哪个方法实现的行为是未定义的。如果您在自己的类中使用类别,则这不太可能成为问题,但在使用类别向标准Cocoa或Cocoa Touch类添加方法时可能会导致问题
苹果使用的是更轻的触摸,但要点是一样的:你会招致灾难,因为不可预知的行为是无声的。谢谢你,但我已经知道了。我只是想知道我的案子是否合法。我的案例与文件略有不同。:)为什么不同?该文件说,如果原始方法不在某个类别中,则是合法的,但强烈反对。那你就可以做了…谢谢你的建议。我这门语言很差。我从你那里得到了新的信息。重写在超类的类别中声明和实现的类别内方法是否正确?链接已断开,这是新版本吗?