isMemberOfClass和isKindOfClass这两个方法是我们在编程中经常遇到的,都是用来判断对象的所属类型的方法。那么两者之间有什么区别呢?下面我们来分析下两者间的区别。
先来看下它们的源码。
+ (BOOL)isMemberOfClass:(Class)cls {
return object_getClass((id)self) == cls;
}
- (BOOL)isMemberOfClass:(Class)cls {
return [self class] == cls;
}
+ (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = object_getClass((id)self); tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
- (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
我们看到isMemberOfClass是和指定的类进行的比较,而isKindOfClass则是先比较指定类,不匹配则不断往上匹配父类,直到找到与之匹配的类。
由此我们可以得出一个结论
isMemberOfClass 是判断一个对象是否是指定类的实例对象。
isKindOfClass 是判断一个对象是否是指定类或指定类的父类的实例对象。
网友评论