runtime使用篇: class_respondsToSelector 、respondsToSelector 和 instancesRespondToSelector

前言:
  • 本篇文章介绍的是以下三个作用相似的函数或方法的使用,以及它们具体的使用区别。
    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 文件中声明,但是子类仍然能响应父类的私有方法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,827评论 0 9
  • 参考链接: http://www.cnblogs.com/ioshe/p/5489086.html 简介 Runt...
    乐乐的简书阅读 2,181评论 0 9
  • 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的...
    西木阅读 30,663评论 33 466
  • 本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的...
    lylaut阅读 832评论 0 4
  • 目录 Objective-C Runtime到底是什么 Objective-C的元素认知 Runtime详解 应用...
    Ryan___阅读 1,965评论 1 3