美文网首页
OC中respondsToSelector方法与instance

OC中respondsToSelector方法与instance

作者: langkee | 来源:发表于2018-07-16 20:03 被阅读203次

    前言

    主要记录一下respondsToSelector方法与instancesRespondToSelector方法的区别,对于很多人来说,平时使用得也比较多,但是可能会对这两个方法的使用弄混淆,希望写在这里对一些同学可以起到一些帮助。

    结论

    respondsToSelector方法

    • 本身是一个实例方法
    - (BOOL)respondsToSelector:(SEL)aSelector;
    
    • 用于class调用(class本身也是一个对象)

    判断class是否实现了相应的类方法

    • 用于object调用

    判断实例对象是否实现了相应的实例方法

    instancesRespondToSelector方法

    • 本身是一个类方法
    + (BOOL)instancesRespondToSelector:(SEL)aSelector;
    
    • 只能用来调用,不能用实例对象来调用

    判断该实例对象是否实现了相应的实例方法

    实践

    创建一项新的工程

    新建一个类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文件中, 先导入Person.h文件
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        Person *personInstance = [Person new];
        
        if ([personInstance respondsToSelector:@selector(classMethod:)]) {
            NSLog(@" - yes - [personInstance respondsToSelector:@selector(classMethod:)]");
        } else {
            // 被执行
            NSLog(@" - no - [personInstance respondsToSelector:@selector(classMethod:)]");
        }
        
        if ([personInstance respondsToSelector:@selector(instanceMethod:)]) {
            // 被执行
            NSLog(@" - yes - [personInstance respondsToSelector:@selector(instanceMethod:)]");
        } else {
            NSLog(@" - no - [personInstance respondsToSelector:@selector(instanceMethod:)]");
        }
        
        if ([Person respondsToSelector:@selector(classMethod:)]) {
            // 被执行
            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 {
            // 被执行
            NSLog(@" - no - [PersonClass respondsToSelector:@selector(instanceMethod:)]");
        }
        
        if ([Person instancesRespondToSelector:@selector(classMethod:)]) {
            NSLog(@" - yes - [PersonClass instancesRespondToSelector:@selector(classMethod:)]");
        } else {
            // 被执行
            NSLog(@" - no - [PersonClass instancesRespondToSelector:@selector(classMethod:)]");
        }
        
        if ([Person instancesRespondToSelector:@selector(instanceMethod:)]) {
            // 被执行
            NSLog(@" - yes - [PersonClass instancesRespondToSelector:@selector(instanceMethod:)]");
        } else {
            NSLog(@" - no - [PersonClass instancesRespondToSelector:@selector(instanceMethod:)]");
        }
        
    }
    
    

    执行结果

    - 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:)] ⑥
    

    结果分析

    • ① ② 表明 判断实例对象是否实现了实例方法(instanceMethod:)

    • ③ ④ 表明 判断类是否实现了类方法(classMethod:)

    • ⑤ ⑥ 表明 判断类的实例对象是否实现了(instanceMethod:)

    写到最后

    遇到这种类似的API,如果有疑问,尽量用代码去验证,结果一目了然。

    相关文章

      网友评论

          本文标题:OC中respondsToSelector方法与instance

          本文链接:https://www.haomeiwen.com/subject/vvfipftx.html