iOSios 参考部分

runtime使用篇: class_respondsToSele

2016-12-23  本文已影响262人  缔造福地
前言:

三个函数 \ 方法的作用都是判断是否响应了某个方法,或者说是判断某个方法有没有被实现。它们都需要用类或类的实例当作参数或调用,那先创建一个类 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 文件中声明,但是子类仍然能响应父类的私有方法。

上一篇 下一篇

猜你喜欢

热点阅读