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

 

posted on 2018-03-15 13:50  fatal-奚山遇白  阅读(309)  评论(0编辑  收藏  举报