在类别中覆盖UIColor的isEqual:方法

时间:2015-04-19 04:07:17

标签: ios objective-c cocoa-touch uicolor

我正在尝试覆盖UIColor isEqual:方法。我是在一个类别方法中这样做的,但它似乎没有从NSArray的{​​{1}}调用,或者甚至直接调用,如下所示。

它已作为类别头文件中的方法公开,我还检查了该类别已导入到我正在处理的实现文件中。

直接调用的地方:

containsObject:

类别方法:

UIColor *col = [UIColor eightBitColorWithRed:pxl.red green:pxl.green blue:pxl.blue];
int index = -1;
for (int i = 0; i < self.colorArrayM.count; i++) {
    if ([col isEqual:((UIColor*)self.colorArrayM[i])]) {
        index = i;
        break;
    }
}

1 个答案:

答案 0 :(得分:1)

简短的回答是类别不是要覆盖现有方法:

  

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

     
      
  • 当某个类别覆盖继承的类别时   方法,类别中的方法   像往常一样,可以调用继承的   通过消息实现super。   但是,如果某个类别覆盖了   类别中存在的方法   类,没有办法调用   原始实施。

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

         

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

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

  •   

您需要调整原始的isEqual:方法才能使用自己的实现。有一个很棒的NSHipster article on swizzling可以帮助你入门。