2013-11-20 6 views
0

У меня был рабочий код для категорий UITextField и UITextField, аналогичный приведенным ниже на устройствах iOS5 и iOS6. Однако метод категории UITextView, похоже, не вызывается на устройстве iOS7 (iPhone5S). Код:Наследование категории UITextView не работает должным образом на устройстве iOS7

@interface UIView (CustomCategory) 
-(void) someCategoryMethod; 
@end 

@implementation UIView (CustomCategory) 
-(void) someCategoryMethod { 
    NSLog(@"UIView category methods appear to work."); 
} 
@end 

@interface UITextField (CustomCategory) 
-(void) someCategoryMethod; 
@end 

@implementation UITextField (CustomCategory) 
-(void) someCategoryMethod { 
    [super someCategoryMethod]; 
    NSLog(@"UITextField category methods appear to work."); 
} 
@end 

@interface UITextView (CustomCategory) 
-(void) someCategoryMethod; 
@end 

@implementation UITextView (CustomCategory) 
-(void) someCategoryMethod { 
    [super someCategoryMethod]; 
    NSLog(@"UITextView category methods appear to work."); 
} 
@end 

void testFunction() { 
    UITextView* textView = [[[UITextView alloc] init] autorelease]; 
    [textView someCategoryMethod]; 

    UITextField* textField = [[[UITextField alloc] init] autorelease]; 
    [textField someCategoryMethod]; 
} 

На устройстве iOS5, это (функции теста) печатает:

UIView category methods appear to work. 
UITextView category methods appear to work. 
UIView category methods appear to work. 
UITextField category methods appear to work. 

Однако, на устройстве iOS7 Печатается:

UIView category methods appear to work. 
UIView category methods appear to work. 
UITextField category methods appear to work. 

Так метод категории UIView фактически вызывается в предпочтении методу категории UITextView, который, как представляется, противоречит this answer.

Может ли кто-нибудь уточнить, должен ли вышеуказанный код работать должным образом (то есть как на iOS5 и iOS6)?

+0

Ваш пример кода не воспроизводит вывод, который вы перечислить ваш вопрос под iOS7. Он выводится с наследованием, как и ожидалось. –

+0

@FruityGeek: код * определенно * выдает указанный результат на iPhone5S, который я использую (поэтому я предположил, что он применяется к iOS7, так как у меня нет других устройств iOS7 для тестирования). –

ответ

1

Избегайте Категория Имя метода Столкновения

Поскольку методы, объявленные в категории добавляются к существующему класса, вы должны быть очень осторожны, об именах методов.

Если имя метода, объявленного в категории такой же, как метод в исходном классе, или метода в другой категории на одной и той же класса (или даже суперкласса), поведение undefined что касается , который используется в реализации во время выполнения.

https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html

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