runtime使用篇: class_respondsToSelector 、respondsToSelector 和 instancesRespondToSelector

前言:
  • 本篇文章介紹的是以下三個作用相似的函數(shù)或方法的使用,以及它們具體的使用區(qū)別。
    BOOL class_respondsToSelector(Class cls, SEL sel)
    - (BOOL)respondsToSelector:(SEL)aSelector; // 方法聲明在 NSObject 協(xié)議中
    + (BOOL)instancesRespondToSelector:(SEL)aSelector; // 方法聲明在 NSObject 類中

三個函數(shù) \ 方法的作用都是判斷是否響應了某個方法,或者說是判斷某個方法有沒有被實現(xiàn)。它們都需要用類或類的實例當作參數(shù)或調(diào)用,那先創(chuàng)建一個類 Person 并在類中添加幾個方法,方法示例如下:

// Person.h
@interface Person : NSObject
// 未聲明
@end

// Person.m
@implementation Person
+ (void)run
{
    NSLog(@"run");
}
- (int)ages
{
    return 30;
}
@end

我們現(xiàn)在通過一組代碼看看它們的區(qū)別,各個 BOOL 值的打印結果標注在每一行的后面

Person *p = [[Person alloc] init];

BOOL yn1 = class_respondsToSelector([Person class], @selector(ages)); // YES
BOOL yn2 = class_respondsToSelector([Person class], @selector(run)); // NO
BOOL yn3 = [[Person class] respondsToSelector:@selector(ages)]; // NO
BOOL yn4 = [[Person class] respondsToSelector:@selector(run)]; // YES
BOOL yn5 = [p respondsToSelector:@selector(ages)]; // YES
BOOL yn6 = [p respondsToSelector:@selector(run)]; // NO
BOOL yn7 = [[Person class] instancesRespondToSelector:@selector(ages)]; // YES
BOOL yn8 = [[Person class] instancesRespondToSelector:@selector(run)]; // NO

1 . class_respondsToSelector 函數(shù)雖然參數(shù)需要傳入一個類,但由yn1yn2 的結果可知該函數(shù)是判斷傳入類中是否實現(xiàn)了指定的『實例方法』。
2 . respondsToSelector 方法聲明在 NSObject 協(xié)議中,調(diào)用者可以是實例也可以是類:由yn3yn4 的結果可知,當調(diào)用者是類時,該方法是判斷這個類中是否實現(xiàn)了指定的『類方法』;由yn5yn6 的結果可知,當調(diào)用者是類的實例時,該方法是判斷這個類中是否實現(xiàn)了指定的『實例方法』。
3 . instancesRespondToSelector 方法聲明在 NSObject 類中且是類方法,只能被類調(diào)用,由yn7yn8 的結果可知,該方法是判斷類中是否實現(xiàn)了指定的『實例方法』。

可知:
class_respondsToSelector 函數(shù)和 instancesRespondToSelector 方法作用相同,和 respondsToSelector 方法被實例調(diào)用時的作用也相同。

注:上述所有結論也適用于子類,比如定義一個子類 LittlePerson 繼承類 Person ,即使 LittlePerson 中沒有重寫 Person 的類方法和實例方法,也盡管 Person 的類方法和實例方法沒有在 Person.h 文件中聲明,但是子類仍然能響應父類的私有方法。

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

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

  • 轉至元數(shù)據(jù)結尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,041評論 0 9
  • 參考鏈接: http://www.cnblogs.com/ioshe/p/5489086.html 簡介 Runt...
    樂樂的簡書閱讀 2,247評論 0 9
  • 這篇文章完全是基于南峰子老師博客的轉載 這篇文章完全是基于南峰子老師博客的轉載 這篇文章完全是基于南峰子老師博客的...
    西木閱讀 30,881評論 33 466
  • 本文詳細整理了 Cocoa 的 Runtime 系統(tǒng)的知識,它使得 Objective-C 如虎添翼,具備了靈活的...
    lylaut閱讀 864評論 0 4
  • 目錄 Objective-C Runtime到底是什么 Objective-C的元素認知 Runtime詳解 應用...
    Ryan___閱讀 2,008評論 1 3

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