Ios 覆盖UIColor';s isEqual:类别内的方法

Ios 覆盖UIColor';s isEqual:类别内的方法,ios,objective-c,cocoa-touch,uicolor,Ios,Objective C,Cocoa Touch,Uicolor,我正在尝试覆盖UIColorisEqual:方法。我是在一个category方法中这样做的,但是它似乎没有被调用,无论是从NSArray的containsObject:,还是直接调用,如下所示 它在类别的头文件中作为方法公开,我还检查了类别是否已导入到我正在处理的实现文件中 直接调用时: UIColor *col = [UIColor eightBitColorWithRed:pxl.red green:pxl.green blue:pxl.blue]; int index = -1; for

我正在尝试覆盖
UIColor
isEqual:
方法。我是在一个category方法中这样做的,但是它似乎没有被调用,无论是从
NSArray
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;
    }
}

简单的回答是,类别并不是为了覆盖现有的方法:

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

  • 当类别覆盖继承的 方法,类别中的方法 可以像往常一样调用继承的 通过发送至
    super
    的消息实施。 但是,如果类别覆盖了 方法中存在的 类,则无法调用 最初的实施

  • 类别不能可靠地重写在同一类的另一个类别中声明的方法

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

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

您需要使用原始的
isEqual:
方法来使用自己的实现。有一个很好的方法可以让您开始。

尝试了swizzling,它似乎切换了实现,即调用了
方法\u exchangeImplementations(originalMethod,SwizzedMethod)
,但是在颜色上调用
isEqual:
时,没有打印来自我的自定义方法的日志,也没有在任何断点处停止。。。(不确定这是否会把事情搞砸?)。最后,我在NSArray上为
containsColor:
indexOfColor:
添加了一个类别,它从UIColor类别调用我的自定义方法。
-(BOOL) isEqual:(id)otherColor {
    if (otherColor == self)
        return YES;
    if (!otherColor || ![otherColor isKindOfClass:[self class]])
        return NO;
    return [self isEqualToColor:otherColor];
}

-(BOOL) isEqualToColor:(UIColor*)otherColor {
    if (self == otherColor)
        return YES;

    unsigned char r0, r1, g0, g1, b0, b1;
    [self eightBitRed:&r0 green:&g0 blue:&b0];
    [otherColor eightBitRed:&r1 green:&g1 blue:&b1];

    return r0 == r1 && g0 == g1 && b0 == b1;
}