前言:
- 本篇文章介绍的是以下三个作用相似的函数或方法的使用,以及它们具体的使用区别。
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
函数虽然参数需要传入一个类,但由yn1
和 yn2
的结果可知该函数是判断传入类中是否实现了指定的『实例方法』。
2 . respondsToSelector
方法声明在 NSObject
协议中,调用者可以是实例也可以是类:由yn3
和 yn4
的结果可知,当调用者是类时,该方法是判断这个类中是否实现了指定的『类方法』;由yn5
和 yn6
的结果可知,当调用者是类的实例时,该方法是判断这个类中是否实现了指定的『实例方法』。
3 . instancesRespondToSelector
方法声明在 NSObject
类中且是类方法,只能被类调用,由yn7
和 yn8
的结果可知,该方法是判断类中是否实现了指定的『实例方法』。
可知:
class_respondsToSelector
函数和 instancesRespondToSelector
方法作用相同,和 respondsToSelector
方法被实例调用时的作用也相同。
注:上述所有结论也适用于子类,比如定义一个子类 LittlePerson
继承类 Person
,即使 LittlePerson
中没有重写 Person
的类方法和实例方法,也尽管 Person
的类方法和实例方法没有在 Person.h
文件中声明,但是子类仍然能响应父类的私有方法。
网友评论