2015-04-19 6 views
1

Я пытаюсь переопределить метод UIColorisEqual:. Я делаю это внутри метода категории, однако он, похоже, не вызван, либо из NSArraycontainsObject:, либо даже при вызове напрямую, как показано ниже.Заменить UIColor's isEqual: метод в категории

Он был показан как метод в заголовочном файле категории, и я также проверил, что категория была импортирована в файл реализации, над которым я работаю.

где она вызывается непосредственно:

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; 
    } 
} 

И категория методы:

-(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; 
} 

ответ

0

Короткий ответ, что категории не предназначены для переопределения существующих методов:

Хотя язык Objective-C в настоящее время позволяет вам использовать категорию для переопределения методов, которые наследует класс, или даже меня thods, объявленные в интерфейсе класса, вам настоятельно не рекомендуется делать это. Категория не подпадает под подкласс. Есть несколько существенных недостатков в использовании категории переопределения методов:

  • Когда категория переопределяет унаследованный метод, метод в категории может, как обычно, вызовут унаследованный реализации в super посредством сообщения , Однако, если категория переопределяет метод , который существует в классе , не существует способа вызвать оригинальную реализацию .

  • Категория не может надежно переопределить методы, объявленные в другой категории того же класса.

    Эта проблема имеет особое значение, поскольку многие классы Cocoa реализуются с использованием категорий. Определенный каркасом метод, который вы пытаетесь переопределить, сам по себе может быть реализован в категории, и поэтому реализация с приоритетом не определена.

  • Само присутствие некоторых методов категорий может привести к поведенческим изменениям во всех средах. Например, если вы переопределите метод делегата windowWillClose: в категории в NSObject, все делегаты окон в вашей программе затем отвечают с использованием метода категории; поведение всех ваших экземпляров NSWindow может измениться. Категории, которые вы добавляете в класс framework, могут вызвать таинственные изменения в поведении и привести к сбоям.

Вам нужно будет Swizzle оригинальный isEqual: метод использовать собственную реализацию. Существует отличный NSHipster article on swizzling, который должен вас начать.

+1

Пробужденный swizzling, и он _seemed_ для переключения реализаций, то есть 'method_exchangeImplementations (originalMethod, swizzledMethod)' был вызван, однако при вызове 'isEqual:' на цвет никаких журналов из моего пользовательского метода не было напечатано и не было остановлено на любые точки останова ... (не уверен, что swizzling испортит это?). В итоге я добавил категорию в NSArray для 'containsColor:' и 'indexOfColor:', которая вызывает мой пользовательский метод из моей категории UIColor. –

Смежные вопросы