二者的作用相同:都是判断某个类是否实现了某方法(注意:是是否实现某方法,必须在.m里写了{}的方法,只在.h里声明了不算),至于区别写个例子说明:
有个类Test,此类有两个公有方法,一个公有类方法:+(void)testLeiFunc; 一个公有实例方法-(void)testShiliFunc;分别在.m中实现这两个方法。通过Test类来说明respondsToSelector与instancesRespondToSelector的区别和联系,代码如下:
//类 + instancesRespondToSelector + 实例方法 yes = 类是否实现了某实例方法 @1
//类 + instancesRespondToSelector + 类方法 no
BOOL b1 = [Test instancesRespondToSelector:@selector(testShiliFunc)];//yes
BOOL b2 = [Test instancesRespondToSelector:@selector(testLeiFunc)];//no
//类 + respondsToSelector + 实例方法 no
//类 + respondsToSelector + 类方法 yes = 类是否实现了某类方法 @2
BOOL b3 = [Test respondsToSelector:@selector(testShiliFunc)];//no
BOOL b4 = [Test respondsToSelector:@selector(testLeiFunc)];//yes
//实例 respondsToSelector 实例方法 yes = 类是否实现了某实例方法 @3 与 @1意思同
//实例 respondsToSelector 类方法 no
Test *t1 = [[Test alloc] init];
BOOL bb1 = [t1 respondsToSelector:@selector(testShiliFunc)];//yes
BOOL bb2 = [t1 respondsToSelector:@selector(testLeiFunc)];//no
结论1:
通过上边代码发现,虽然有6中组合方式,但是有实际意义的组合只有3种
@1 类 + instancesRespondToSelector + 实例方法 yes = 类是否实现了某实例方法
@2 类 + respondsToSelector + 类方法 yes = 类是否实现了某类方法
@3 实例 respondsToSelector 实例方法 yes = 类是否实现了某实例方法
显然@1和@3的作用相同
结论2:
respondsToSelector虽然是减号开头,但是类和类的实例都能调用
结论3:
根据上述,二者区别如下:
1、调用者: instancesRespondToSelector 前边只能是类调用,类的实例不能调用此方法
respondsToSelector 前边类或类的实例都能调用此方法
2、调用的方法: instancesRespondToSelector 后边只能跟 实例方法
二者联系如下:
类 + instancesRespondToSelector + 实例方法 = 类的实例 + respondsToSelector + 实例方法 都是判断某个类的.m是否实现了某实例方法 即上边的@1= @3
代码:https://download.csdn.net/download/denggun12345/10755579