2013-05-21 52 views
3

我花了相當一段時間試圖弄清楚class_respondsToSelectorrespondsToSelector可以給出不同的結果。考慮下面的類:爲什麼class_respondsToSelector和respondsToSelector在發送到Class時行爲有所不同?

@interface Dummy : NSObject 
- (void)test; 
@end 

@implementation Dummy 
- (void)test {} 
@end 

我的情況是,我試圖確定如果一個類響應某一類方法。這片重新產生問題:

Class class = [Dummy class]; 
if (class_respondsToSelector(class, @selector(test))) 
    NSLog(@"class_respondsToSelector: YES"); 
else 
    NSLog(@"class_respondsToSelector: NO"); 
if ([class respondsToSelector:@selector(test)]) 
    NSLog(@"respondsToSelector: YES"); 
else 
    NSLog(@"respondsToSelector: NO"); 

如果刪除了宣言和執行-test,上述輸出是NO和NO如預期。但是,運行它,因爲它讀取上述(包括-test),產生的輸出是下面的:

class_respondsToSelector:YES

respondsToSelector:否

文檔隻字未提是否respondsToSelector作品只是它的表示接收器是否實現...,因此我無法確定這是否是正確的行爲。我錯過了什麼嗎?

更新

格雷厄姆·李提供此鏈接到一個great discussion on the problem

回答

8

class_respondsToSelector()提問的問題是:「這個類的實例是否響應這個選擇器?」

-[NSObject respondsToSelector:]提問的問題是「這個特定的實例(哪個是」reciever「)對這個選擇器有反應嗎?」

您正在將respondsToSelector:發送給一個類對象,該對象本身就是其元類的一個實例,並詢問該特定對象。

要查看與class_respondsToSelector()相同的結果,請使用+[NSObject instancesRespondToSelector:]或獲取該類的實例。

相關問題