最近团队在研究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库中实现了以下对比