为了账号安全,请及时绑定邮箱和手机立即绑定

使用目标C中类别的重写方法

使用目标C中类别的重写方法

慕森王 2019-06-24 16:34:52
使用目标C中类别的重写方法是否可以使用类别覆盖已经使用类别实现的方法?就像这样:1)原始方法-(BOOL) method {   return true;}2)过载法-(BOOL) method {   NSLog(@"error?");    return true; }这是可行的,还是非法的?
查看完整描述

3 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

尽管Object-C语言目前允许您使用类别来覆盖类继承的方法,即使是类接口中声明的方法,也强烈建议您不要这样做。..类别不能代替子类。使用类别覆盖方法有几个重大缺点:

  • 当类别覆盖继承的方法时,类别中的方法可以像往常一样通过消息调用继承的实现super..然而,如果类别覆盖类别的类中存在的方法,则无法调用原始实现.

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

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

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


查看完整回答
反对 回复 2019-06-24
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

你可以通过调整类簇接近,或使用摇摆法技术。

否则,两个或两个以上的行为分类方法是未定


查看完整回答
反对 回复 2019-06-24
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

避免类别方法名称冲突

因为在类别中声明的方法被添加到现有的类中,所以您需要非常小心地处理方法名称。

如果在类别中声明的方法的名称与原始类中的方法相同,或同一类(甚至是超类)上的另一个类别中的方法相同,则未定义在运行时使用哪种方法实现的行为。如果您在自己的类中使用类别,这就不太可能成为问题,但是当使用类别将方法添加到标准Cocoa或CocoaTouch类时可能会导致问题。

这是苹果使用的更轻的触摸,但要点是一样的:你招致灾难,因为不可预测的行为是沉默的。


查看完整回答
反对 回复 2019-06-24
  • 3 回答
  • 0 关注
  • 614 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信