I've implemented a protocol with an optional method and in the calling method I want to send respondsToSelector:
to self.delegate
before I send the message, but that does not compile. The fail message is:
No Known instance method for selector 'respondsToSelector'.
As a work-around, I "sanitized" the delegate as shown below, which compiles...
//MyClass.h: @class MyClass; @Protocol MyClassDelegate - (void)myClass:(MyClass *)sender willDoSomething:(BOOL)animated; @end @interface MyClass : UIViewController @property (nonatomic, weak) id<MyClassDelegate> delegate; @end
and
//MyClass.m: ... @synthesize delegate = _delegate; ... id sanitizedDelegate = self.delegate; //Hmmmm... why does this work? if ([sanitizedDelegate respondsToSelector:@selector(myClass:willDoSomething:)]) { [self.delegate myClass:self willDoSomething:animated]; }
.
I checked a number of posts including this one but it does not answer the compilation fail issue.
Also, alternative accessors do not work...
[self delegate] //or _delegate
Has anyone seen this or can advise a better way of handling?
IOS 5.0:(9A334), Xcode 4.2.1 (4D502)
-respondsToSelector:
is a method on NSObject. Either assume that your id
delegate is in fact an NSObject, and cast it:
[(NSObject*)self.delegate respondsToSelector:@selector(myClass:willDoSomething:)]
Or, better, make your delegate explicitly an NSObject:
@property (nonatomic, weak) NSObject<MyClassDelegate>* delegate;
Or make the protocol be a sub-protocol of NSObject:
@protocol MyClassDelegate <NSObject>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With