Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

self.delegate respondsToSelector: ... does not compile

Tags:

xcode

ios5

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)

like image 372
vmanjz Avatar asked Mar 06 '12 07:03

vmanjz


1 Answers

-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>

like image 51
Kurt Revis Avatar answered Sep 23 '22 23:09

Kurt Revis