声明的协议protocol没有从NSObject继承
如:
<code style="margin: 0px; padding: 0px; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, sans-serif; white-space: inherit;"><span class="com" style="color: rgb(128, 128, 128); margin: 0px; padding: 0px; border: 0px;">//MyClass.h:</span><span class="pln" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;">
</span><span class="lit" style="color: rgb(128, 0, 0); margin: 0px; padding: 0px; border: 0px;">@class</span><span class="pln" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;"> </span><span class="typ" style="color: rgb(43, 145, 175); margin: 0px; padding: 0px; border: 0px;">MyClass</span><span class="pun" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;">;</span><span class="pln" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;">
</span><span style="color: rgb(204, 0, 0);"><span class="lit" style="margin: 0px; padding: 0px; border: 0px;">@Protocol</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px;"> </span><span class="typ" style="margin: 0px; padding: 0px; border: 0px;">MyClassDelegate</span></span><span class="pln" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;">
</span><span class="pun" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;">-</span><span class="pln" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;"> </span><span class="pun" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;">(</span><span class="kwd" style="color: rgb(0, 0, 139); margin: 0px; padding: 0px; border: 0px;">void</span><span class="pun" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;">)</span><span class="pln" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;">myClass</span><span class="pun" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;">:(</span><span class="typ" style="color: rgb(43, 145, 175); margin: 0px; padding: 0px; border: 0px;">MyClass</span><span class="pln" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;"> </span><span class="pun" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;">*)</span><span class="pln" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;">sender willDoSomething</span><span class="pun" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;">:(</span><span class="pln" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;">BOOL</span><span class="pun" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;">)</span><span class="pln" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;">animated</span><span class="pun" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;">;</span><span class="pln" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;">
</span><span class="lit" style="color: rgb(128, 0, 0); margin: 0px; padding: 0px; border: 0px;">@end</span><span class="pln" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;">
</span><span class="lit" style="color: rgb(128, 0, 0); margin: 0px; padding: 0px; border: 0px;">@interface</span><span class="pln" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;"> </span><span class="typ" style="color: rgb(43, 145, 175); margin: 0px; padding: 0px; border: 0px;">MyClass</span><span class="pln" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;"> </span><span class="pun" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;">:</span><span class="pln" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;"> </span><span class="typ" style="color: rgb(43, 145, 175); margin: 0px; padding: 0px; border: 0px;">UIViewController</span><span class="pln" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;">
</span><span class="lit" style="color: rgb(128, 0, 0); margin: 0px; padding: 0px; border: 0px;">@property</span><span class="pln" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;"> </span><span class="pun" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;">(</span><span class="pln" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;">nonatomic</span><span class="pun" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;">,</span><span class="pln" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;"> weak</span><span class="pun" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;">)</span><span class="pln" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;"> id</span><span class="pun" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;"><</span><span class="typ" style="color: rgb(43, 145, 175); margin: 0px; padding: 0px; border: 0px;">MyClassDelegate</span><span class="pun" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;">></span><span class="pln" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;"> </span><span class="kwd" style="color: rgb(0, 0, 139); margin: 0px; padding: 0px; border: 0px;">delegate</span><span class="pun" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;">;</span><span class="pln" style="color: rgb(0, 0, 0); margin: 0px; padding: 0px; border: 0px;">
</span><span class="lit" style="color: rgb(128, 0, 0); margin: 0px; padding: 0px; border: 0px;">@end</span></code>
and
<code style="margin: 0px; padding: 0px; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, sans-serif; white-space: inherit;"><span class="com" style="margin: 0px; padding: 0px; border: 0px; color: rgb(128, 128, 128);">//MyClass.m:</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);">
</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);">...</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);">
</span><span class="lit" style="margin: 0px; padding: 0px; border: 0px; color: rgb(128, 0, 0);">@synthesize</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 139);">delegate</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);">=</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);"> _delegate</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);">;</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);">
</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);">...</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);">
id sanitizedDelegate </span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);">=</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 139);">self</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);">.</span><span class="kwd" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 139);">delegate</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);">;</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);"> </span><span class="com" style="margin: 0px; padding: 0px; border: 0px; color: rgb(128, 128, 128);">//Hmmmm... why does this work?</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);">
</span><span class="kwd" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 139);">if</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);">([</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);">sanitizedDelegate respondsToSelector</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);">:</span><span class="lit" style="margin: 0px; padding: 0px; border: 0px; color: rgb(128, 0, 0);">@selector</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);">(</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);">myClass</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);">:</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);">willDoSomething</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);">:)])</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);">{</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);">
</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);">[</span><span class="kwd" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 139);">self</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);">.</span><span class="kwd" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 139);">delegate</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);"> myClass</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);">:</span><span class="kwd" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 139);">self</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);"> willDoSomething</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);">:</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);">animated</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);">];</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);">
</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 0);">}</span></code>
这样会报错
the compilation fail
解决办法
-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>