美文网首页iOSios 参考部分
runtime使用篇: class_respondsToSele

runtime使用篇: class_respondsToSele

作者: 缔造福地 | 来源:发表于2016-12-23 23:27 被阅读262次
    前言:
    • 本篇文章介绍的是以下三个作用相似的函数或方法的使用,以及它们具体的使用区别。
      BOOL class_respondsToSelector(Class cls, SEL sel)
      - (BOOL)respondsToSelector:(SEL)aSelector; // 方法声明在 NSObject 协议中
      + (BOOL)instancesRespondToSelector:(SEL)aSelector; // 方法声明在 NSObject 类中

    三个函数 \ 方法的作用都是判断是否响应了某个方法,或者说是判断某个方法有没有被实现。它们都需要用类或类的实例当作参数或调用,那先创建一个类 Person 并在类中添加几个方法,方法示例如下:

    // Person.h
    @interface Person : NSObject
    // 未声明
    @end
    
    // Person.m
    @implementation Person
    + (void)run
    {
        NSLog(@"run");
    }
    - (int)ages
    {
        return 30;
    }
    @end
    

    我们现在通过一组代码看看它们的区别,各个 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 函数虽然参数需要传入一个类,但由yn1yn2 的结果可知该函数是判断传入类中是否实现了指定的『实例方法』
    2 . respondsToSelector 方法声明在 NSObject 协议中,调用者可以是实例也可以是类:由yn3yn4 的结果可知,当调用者是类时,该方法是判断这个类中是否实现了指定的『类方法』;由yn5yn6 的结果可知,当调用者是类的实例时,该方法是判断这个类中是否实现了指定的『实例方法』
    3 . instancesRespondToSelector 方法声明在 NSObject 类中且是类方法,只能被类调用,由yn7yn8 的结果可知,该方法是判断类中是否实现了指定的『实例方法』

    可知:
    class_respondsToSelector 函数和 instancesRespondToSelector 方法作用相同,和 respondsToSelector 方法被实例调用时的作用也相同。

    注:上述所有结论也适用于子类,比如定义一个子类 LittlePerson 继承类 Person ,即使 LittlePerson 中没有重写 Person 的类方法和实例方法,也尽管 Person 的类方法和实例方法没有在 Person.h 文件中声明,但是子类仍然能响应父类的私有方法。

    相关文章

      网友评论

      本文标题:runtime使用篇: class_respondsToSele

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