Co jest nie tak z użyciem kategorii w NSObject, aby zapewnić domyślną implementację protokołu?

Szukałem sposobu na użycie opcjonalnych metod protokołu i posiadanie czystego kodu. Innymi słowy:
1: NierespondsToSelector: dzwoni po całym moim kodzie
2. Powinien działać dla każdego podpisu metody, więc metoda kategorii w NSObject dokonująca sprawdzenia i wywołaniaperformSelector: is out (a NSInvocation ma problemy ze współpracą z ARC)
3: Torozwiązanie, IMO, udaje uniwersalny, ale ma wszystkie wady 1

W końcu wpadłem na ten pomysł:

@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

Wydaje się, że działa, tj .:

...
ClassA *objA = [[ClassA alloc] init];
ClassB *objB = [[ClassB alloc] init];

[objA optionalMethod]; //prints "ClassA implements optionalMethod"
[objB optionalMethod]; //prints "ClassB does not implement optionalMethod"

Podczas gdy wiele miejsc w Internecie omawia ten problem, nie natknąłem się na to rozwiązanie, co sprawia, że ​​myślę, że jest z nim coś nie tak - jakaś poważna sprawa, w której się nie powiedzie lub będzie nieprzewidywalna.

Czy powinienem to zrobić, czy moje obawy są ważne?

questionAnswers(1)

yourAnswerToTheQuestion