最近团队在研究Aspects库中发现了一点疑惑,即如下图所示为什么要有respondsToSelector和instancesRespondToSelector两个判断?:

所以我们查看了一下objc中关于这两个方法的实现:
+ (BOOL)instancesRespondToSelector:(SEL)sel {
if (!sel) return NO;
return class_respondsToSelector(self, sel);
}
+ (BOOL)respondsToSelector:(SEL)sel {
if (!sel) return NO;
return class_respondsToSelector_inst(object_getClass(self), sel, self);
}
- (BOOL)respondsToSelector:(SEL)sel {
if (!sel) return NO;
return class_respondsToSelector_inst([self class], sel, self);
}
然后加以实践
@interface Test : NSObject - (void)objectFun; + (void)classFun; @end
BOOL flag;
flag = [Test instancesRespondToSelector:@selector(objectFun)]; //YES
flag = [Test instancesRespondToSelector:@selector(classFun)]; //NO
flag = [Test respondsToSelector:@selector(objectFun)]; //NO
flag = [Test respondsToSelector:@selector(classFun)]; //YES
Test *obj = [[Test alloc] init];
flag = [obj respondsToSelector:@selector(objectFun)]; //YES
flag = [obj respondsToSelector:@selector(classFun)]; //NO
所以我们可以看出:
【1】instancesRespondToSelector只是类方法,respondsToSelector有类方法和实例方法两种实现
【2】 [类 instancesRespondToSelector]判断的是该类是否包含某实例方法,等效于:[该类的实例 respondsToSelector]。
【3】 [类 respondsToSelector]用于判断是否包含某个类方法,[该类的实例 respondsToSelector]用于判断该实例是否包含某个实例方法。
也就是Aspects库中实现了以下对比

浙公网安备 33010602011771号