OC中respondsToSelector方法與instancesRespondToSelector方法的區(qū)別

前言

主要記錄一下respondsToSelector方法與instancesRespondToSelector方法的區(qū)別,對于很多人來說,平時使用得也比較多,但是可能會對這兩個方法的使用弄混淆,希望寫在這里對一些同學(xué)可以起到一些幫助。

結(jié)論

respondsToSelector方法

  • 本身是一個實(shí)例方法
- (BOOL)respondsToSelector:(SEL)aSelector;
  • 用于class調(diào)用(class本身也是一個對象)

判斷class是否實(shí)現(xiàn)了相應(yīng)的類方法

  • 用于object調(diào)用

判斷實(shí)例對象是否實(shí)現(xiàn)了相應(yīng)的實(shí)例方法。

instancesRespondToSelector方法

  • 本身是一個類方法
+ (BOOL)instancesRespondToSelector:(SEL)aSelector;
  • 只能用來調(diào)用,不能用實(shí)例對象來調(diào)用

判斷該實(shí)例對象是否實(shí)現(xiàn)了相應(yīng)的實(shí)例方法。

實(shí)踐

創(chuàng)建一項(xiàng)新的工程

新建一個類Person, 繼承于NSObject

在Person.h文件中
// Person.h文件
@interface Person : NSObject
+ (void)classMethod:(NSString *)invoker;
- (void)instanceMethod:(NSString *)methodName;
@end
在Person.m文件中
//Person.m文件
@implementation Person

+ (void)classMethod:(NSString *)invoker {
    NSLog(@"method: classMethod has implemented!");
}

- (void)instanceMethod:(NSString *)methodName {
    NSLog(@"method: instanceMethod has implemented!");
}

@end
在ViewController.m文件中, 先導(dǎo)入Person.h文件
- (void)viewDidLoad {
    [super viewDidLoad];
    
    Person *personInstance = [Person new];
    
    if ([personInstance respondsToSelector:@selector(classMethod:)]) {
        NSLog(@" - yes - [personInstance respondsToSelector:@selector(classMethod:)]");
    } else {
        // 被執(zhí)行
        NSLog(@" - no - [personInstance respondsToSelector:@selector(classMethod:)]");
    }
    
    if ([personInstance respondsToSelector:@selector(instanceMethod:)]) {
        // 被執(zhí)行
        NSLog(@" - yes - [personInstance respondsToSelector:@selector(instanceMethod:)]");
    } else {
        NSLog(@" - no - [personInstance respondsToSelector:@selector(instanceMethod:)]");
    }
    
    if ([Person respondsToSelector:@selector(classMethod:)]) {
        // 被執(zhí)行
        NSLog(@" - yes - [PersonClass respondsToSelector:@selector(classMethod:)]");
    } else {
        NSLog(@" - no - [PersonClass respondsToSelector:@selector(classMethod:)]");
    }
    
    if ([Person respondsToSelector:@selector(instanceMethod:)]) {
        NSLog(@" - yes - [PersonClass respondsToSelector:@selector(instanceMethod:)]");
    } else {
        // 被執(zhí)行
        NSLog(@" - no - [PersonClass respondsToSelector:@selector(instanceMethod:)]");
    }
    
    if ([Person instancesRespondToSelector:@selector(classMethod:)]) {
        NSLog(@" - yes - [PersonClass instancesRespondToSelector:@selector(classMethod:)]");
    } else {
        // 被執(zhí)行
        NSLog(@" - no - [PersonClass instancesRespondToSelector:@selector(classMethod:)]");
    }
    
    if ([Person instancesRespondToSelector:@selector(instanceMethod:)]) {
        // 被執(zhí)行
        NSLog(@" - yes - [PersonClass instancesRespondToSelector:@selector(instanceMethod:)]");
    } else {
        NSLog(@" - no - [PersonClass instancesRespondToSelector:@selector(instanceMethod:)]");
    }
    
}

執(zhí)行結(jié)果

- no - [personInstance respondsToSelector:@selector(classMethod:)]          ①
- yes - [personInstance respondsToSelector:@selector(instanceMethod:)]      ②
- yes - [PersonClass respondsToSelector:@selector(classMethod:)]            ③
- no - [PersonClass respondsToSelector:@selector(instanceMethod:)]          ④
- no - [PersonClass instancesRespondToSelector:@selector(classMethod:)]     ⑤
- yes - [PersonClass instancesRespondToSelector:@selector(instanceMethod:)] ⑥

結(jié)果分析

  • ① ② 表明 判斷實(shí)例對象是否實(shí)現(xiàn)了實(shí)例方法(instanceMethod:)

  • ③ ④ 表明 判斷類是否實(shí)現(xiàn)了類方法(classMethod:)

  • ⑤ ⑥ 表明 判斷類的實(shí)例對象是否實(shí)現(xiàn)了(instanceMethod:)

寫到最后

遇到這種類似的API,如果有疑問,盡量用代碼去驗(yàn)證,結(jié)果一目了然。

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

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

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