Я искал способ использовать дополнительные методы протокола и иметь чистый код. Другими словами:
1: Нет respondsToSelector:
вызовов во всем моем коде
2. Должен работать для любой сигнатуры метода, поэтому метод категории в NSObject, выполняющий проверку и вызывающий performSelector:
, отсутствует (и у NSInvocation есть проблемы с взаимодействием с ARC)
3: Это solution, 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"
Хотя во многих местах в Интернете обсуждается эта проблема, я не наткнулся на это решение, что заставляет меня думать, что с ним что-то не так - какой-то серьезный случай, когда он потерпит неудачу или будет непредсказуемым.
Должен ли я просто сделать это, или мои опасения справедливы?
[objectWhichDoesNotDeclareConformanceToTheProtocol theOptionalProtocolMethod];
. Фактически, именно так были изначально реализованы дополнительные методы протокола: Неформальный протокол в ObjC Другое дело, что методы, которые вы добавляете в классы фреймворка, в идеале должны иметь префиксы, чтобы избежать коллизий. - person jscs   schedule 12.10.2013