前言
许多有多年工作经验的朋友,可能都还没有真正弄清楚这三个方法的具体使用环境,只是写代码的时候,知道它们的作用是根据类名(对象名)判断是否属于这个类,但实际上这三个方法在细节上还是有一些区别的。下面是我做的分析:
-
先看Apple官方文档的截图
- 解释:返回一个BOOL类型的值,如果调用该方法的类是参数类的一个子类或者就是这个类本身,则返回YES,否则返回NO (注意是类方法,用类调用)
@interface Grandpa : NSObject
@interface Father : Grandpa
@interface Son : Father
BOOL result1 = [Son isSubclassOfClass:[Son class]]; // YES
BOOL result2 = [Son isSubclassOfClass:[Father class]];// YES
BOOL result3 = [Son isSubclssOfClass:[Grandpa class]];// YES
BOOL result4 = [Son isSubclassOfClass:[NSArray class]];// NO
-
Apple官方文档
- 解释:返回一个BOOL类型的值,如果调用该方法的对象是参数类的一个对象,就返回YES,否则返回NO
@interface Grandpa : NSObject
@interface Father : Grandpa
@interface Son : Father
Father *fatehr = [[Father alloc]init];
BOOL result5 = [fatehr isMemberOfClass:[Father class]];// YES
BOOL result6 = [fatehr isMemberOfClass:[Grandpa class]];// NO 父类不被承认
BOOL result7 = [fatehr isMemberOfClass:[NSArray class]];// NO
-
Apple官方文档
- 解释:返回一个BOOL类型的值,如果调用该方法的对象是参数类的一个对象,或者任何被继承的类的对象,就返回YES,否则返回NO。
@interface Grandpa : NSObject
@interface Father : Grandpa
@interface Son : Father
Son *son = [[Son alloc]init];
BOOL result8 = [son isKindOfClass:[Son class]];// YES
BOOL result9 = [son isKindOfClass:[Father class]];// YES 继承于父类被承认
BOOL result10 = [son isKindOfClass:[Grandpa class]];// YES 继承于爷爷类,也被承认
BOOL result11 = [son isKindOfClass:[NSArray class]];// NO
总结:
- isMemberOfClass 和 isKindOfClass的用法类似,只是isMemberOfClass的判断条件更为严格,必须是对象和类相匹配的时候才返回YES(继承过来的都不行),而isKindOfClass,继承过来的类也返回YES。
- isSubclassOf 首先是类方法,用类调用。如果调用该方法的类是参数类的一个子类,或者就是参数类本身的时候返回YES,否则返回NO。