respondsToSelector和 instancesRespondToSelector的理解

respondsToSelector 和 instancesRespondToSelector是兩個常用的方法,我們經(jīng)常使用 someObject respondsToSelector,但是對于它和instancesRespondToSelector之間有什么區(qū)別?

首先先看兩個方法的聲明

@interface NSObject <NSObject>
+ (BOOL)instancesRespondToSelector:(SEL)aSelector;
@end

@protocol NSObject
- (BOOL)respondsToSelector:(SEL)aSelector;
@end

我們可以以UIScreen來進行說明

@interface UIScreen : NSObject <UITraitEnvironment>
+ (UIScreen *)mainScreen;
@property(nullable,nonatomic,strong) UIScreenMode *currentMode
@end

測試代碼

    UIScreen *screens = [UIScreen mainScreen];
    if ([screens.class instancesRespondToSelector:@selector(currentMode)]){
        NSLog(@"[screens.class instancesRespondToSelector:@selector(currentMode)]能響應");
    }

    if ([screens respondsToSelector:@selector(currentMode)]){
        NSLog(@"[screens respondsToSelector:@selector(currentMode)]能響應");
    }

    if ([screens.class respondsToSelector:@selector(currentMode)]){
        NSLog(@"[screens.class respondsToSelector:@selector(currentMode)]能響應");
    }


    if ([UIScreen instancesRespondToSelector:@selector(currentMode)]){
        NSLog(@"[UIScreen instancesRespondToSelector:@selector(currentMode)]能響應");
    }

    if ([UIScreen respondsToSelector:@selector(currentMode)]){
        NSLog(@"[UIScreen respondsToSelector:@selector(currentMode)]能響應");
    }

輸出

2016-06-30 16:17:24.501 TestNSlog[84989:2019395] [screens.class instancesRespondToSelector:@selector(currentMode)]能響應
2016-06-30 16:17:24.501 TestNSlog[84989:2019395] [screens respondsToSelector:@selector(currentMode)]能響應
2016-06-30 16:17:24.502 TestNSlog[84989:2019395] [screens.class respondsToSelector:@selector(currentMode)]不能響應
2016-06-30 16:17:26.181 TestNSlog[84989:2019395] [UIScreen instancesRespondToSelector:@selector(currentMode)]能響應
2016-06-30 16:17:26.181 TestNSlog[84989:2019395] [UIScreen respondsToSelector:@selector(currentMode)]不能響應

說明: instancesRespondToSelector是一個類方法,用來判斷該類的的實例(即對象)是否響應某個方法
respondsToSelector 是一個實例(對象)方法,用來判斷該實例(對象)是否響應某個方法

從定義看,UIScreenMode *currentMode是一個實例屬性
所以[screens.class instancesRespondToSelector:@selector(currentMode)] 是能夠響應的!!
[screens respondsToSelector:@selector(currentMode)] 能響應

[screens.class respondsToSelector:@selector(currentMode)],由于screens.class得到的是 類本身,所以當然不能響應實例方法了
同理[UIScreen respondsToSelector:@selector(currentMode)]不能響應!!!

測試代碼

    if ([screens.class instancesRespondToSelector:@selector(mainScreen)]){
        NSLog(@"[screens.class instancesRespondToSelector:@selector(mainScreen)]能響應");
    }
    else{
        NSLog(@"[screens.class instancesRespondToSelector:@selector(mainScreen)]不能響應");
    }

    if ([screens respondsToSelector:@selector(mainScreen)]){
        NSLog(@"[screens respondsToSelector:@selector(mainScreen)]能響應");
    }
    else{
        NSLog(@"[screens respondsToSelector:@selector(mainScreen)]不能響應");
    }

    if ([screens.class respondsToSelector:@selector(mainScreen)]){
        NSLog(@"[screens.class respondsToSelector:@selector(mainScreen)]能響應");
    }
    else{
        NSLog(@"[screens.class respondsToSelector:@selector(mainScreen)]不能響應");
    }


    if ([UIScreen instancesRespondToSelector:@selector(mainScreen)]){
        NSLog(@"[UIScreen instancesRespondToSelector:@selector(mainScreen)]能響應");
    }
    else{
        NSLog(@"[UIScreen instancesRespondToSelector:@selector(mainScreen)]不能響應");
    }

    if ([UIScreen respondsToSelector:@selector(mainScreen)]){
        NSLog(@"[UIScreen respondsToSelector:@selector(mainScreen)]能響應");
    }
    else{
        NSLog(@"[UIScreen respondsToSelector:@selector(mainScreen)]不能響應");
    }

輸出

2016-06-30 16:27:44.244 TestNSlog[85085:2029436] [screens.class instancesRespondToSelector:@selector(mainScreen)]不能響應
2016-06-30 16:27:45.876 TestNSlog[85085:2029436] [screens respondsToSelector:@selector(mainScreen)]不能響應
2016-06-30 16:27:47.364 TestNSlog[85085:2029436] [screens.class respondsToSelector:@selector(mainScreen)]能響應
2016-06-30 16:27:51.156 TestNSlog[85085:2029436] [UIScreen instancesRespondToSelector:@selector(mainScreen)]不能響應
2016-06-30 16:27:53.372 TestNSlog[85085:2029436] [UIScreen respondsToSelector:@selector(mainScreen)]能響應

[screens.class instancesRespondToSelector:@selector(mainScreen)],由于mainScreen是類方法,這里判斷實例是否響應,當然是不能響應!!
[screens respondsToSelector:@selector(mainScreen)],screens是一個實例(對象),這里判斷它是否響應一個類方法,當然不能響應
[screens.class respondsToSelector:@selector(mainScreen)],screens.class是類本身,當然可以響應

我們從中應該知道, 類 其實 也是一個兌現(xiàn)哥只是,是一個特殊對象!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,106評論 0 9
  • Objective-C語言是一門動態(tài)語言,它將很多靜態(tài)語言在編譯和鏈接時期做的事放到了運行時來處理。這種動態(tài)語言的...
    有一種再見叫青春閱讀 682評論 0 3
  • 參考鏈接: http://www.cnblogs.com/ioshe/p/5489086.html 簡介 Runt...
    樂樂的簡書閱讀 2,252評論 0 9
  • 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的...
    西木閱讀 30,906評論 33 466
  • 轉(zhuǎn)載:http://yulingtianxia.com/blog/2014/11/05/objective-c-r...
    F麥子閱讀 843評論 0 2

友情鏈接更多精彩內(nèi)容