Търсих начин да използвам незадължителни протоколни методи и да имам чист код. С други думи:
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"
Въпреки че на много места онлайн се обсъжда този проблем, аз не попаднах на това решение, което ме кара да мисля, че има нещо нередно с него -- някакъв основен случай, при който ще се провали или ще бъде непредсказуем.
Трябва ли просто да го направя или притесненията ми са основателни?
[objectWhichDoesNotDeclareConformanceToTheProtocol theOptionalProtocolMethod];
Това всъщност е начинът, по който първоначално са били внедрени незадължителните протоколни методи: Неформален протокол в ObjC Другото нещо е, че методите, които вие добавяте към класовете на рамката, в идеалния случай трябва да имат префикс, за да се избегнат сблъсъци. - person jscs   schedule 12.10.2013