两个方法都是用来判断对象(类也属于对象)是否响应某个方法。
两方法的声明:
@protocol NSObject
- (BOOL)respondsToSelector:(SEL)aSelector;
@end
@interface NSObject <NSObject>
+ (BOOL)instancesRespondToSelector:(SEL)aSelector;
@end
先来总结一下:
- 响应实例方法
- 类respondsToSelector不能响应实例方法。
- 类instancesRespondToSelector能响应实例方法。
- 实例respondsToSelector能响应实例方法。
- 响应类方法
- 类respondsToSelector能响应类方法。
- 类instancesRespondToSelector不能响应类方法。
- 实例respondsToSelector不能响应类方法。
测试代码如下:
[self compareRespondMethod:[UIView class] selctor:@selector(backgroundColor)];
[self compareRespondMethod:self.view selctor:@selector(backgroundColor)];
[self compareRespondMethod:[UIView class] selctor:@selector(layerClass)];
[self compareRespondMethod:self.view selctor:@selector(layerClass)];
- (void)compareRespondMethod:(id)object selctor:(SEL)selctor{
BOOL isClassRespond = NO,isInstanceRespond = NO;
if ([object isKindOfClass:[UIView class]]) {
if ([object respondsToSelector:selctor]) {
isInstanceRespond = YES;
}
NSLog(@"instance respondsToSelector %@ ",isInstanceRespond?@"YES":@"NO");
}else{
if ([object respondsToSelector:selctor]) {
isClassRespond = YES;
}
if ([object instancesRespondToSelector:selctor]) {
isInstanceRespond = YES;
}
NSLog(@"class respondsToSelector %@ \n class instancesRespondToSelector %@",isClassRespond?@"YES":@"NO",isInstanceRespond?@"YES":@"NO");
}
}
测试结果
实例方法测试结果:
class respondsToSelector NO
class instancesRespondToSelector YES
instance respondsToSelector YES
类方法测试结果:
class respondsToSelector YES
class instancesRespondToSelector NO
instance respondsToSelector NO
再回首看看总结,应该可以理解。
ps:本文不涉及到类别中的实例方法和类方法,有需要可以自行测试。
网友评论