Что плохого в использовании категории в NSObject для обеспечения реализации протокола по умолчанию?
Я искал способ использовать дополнительные методы протокола и иметь чистый код. Другими словами:
1: нетrespondsToSelector:
звонки по всему моему коду
2. Должен работать для любой сигнатуры метода, поэтому метод категории в NSObject делает проверку и вызовperformSelector:
отсутствует (и NSInvocation имеет проблемы с сотрудничеством с ARC)
3: эторешение, IMO, претендует на универсальность, но имеет все недостатки 1
В конце концов я пришел с этой идеей:
@protocol MyProtocol <NSObject>
@optional
-(void)optionalMethod;
@end
@interface ClassA : NSObject <MyProtocol>
@end
@implementation ClassA
-(void)optionalMethod{
NSLog(@"ClassA implements optionalMethod");
}
@end
@interface ClassB : NSObject <MyProtocol>
@end
@implementation ClassB
//classB does not implement optionalMethod
@end
@interface NSObject (DefaultMyProtocolImplementation)
-(void)optionalMethod;
@end
@implementation NSObject (DefaultMyProtocolImplementation)
-(void)optionalMethod{
NSLog(@"%@ does not implement optionalMethod", NSStringFromClass([self class]));
}
@end
Вроде работает, т.е.
...
ClassA *objA = [[ClassA alloc] init];
ClassB *objB = [[ClassB alloc] init];
[objA optionalMethod]; //prints "ClassA implements optionalMethod"
[objB optionalMethod]; //prints "ClassB does not implement optionalMethod"
Хотя многие места в Интернете обсуждают эту проблему, я не сталкивался с этим решением, которое заставляет меня думать, что с ним что-то не так - какой-то серьезный случай, когда оно не удастся или будет непредсказуемым.
Должен ли я просто сделать это, или мои опасения актуальны?