前言:
NSObject很多源码是公开的,可以下载源码查看一些方法的实现
废话不多说,直接上源码:
+ (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;
}
+ (BOOL)isSubclassOfClass:(Class)cls {
for (Class tcls = self; tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
+ (BOOL)isAncestorOfObject:(NSObject *)obj {
for (Class tcls = [obj class]; tcls; tcls = tcls->superclass) {
if (tcls == self) return YES;
}
return NO;
}
我们可以发现isMemberOfClass,isKindOfClass的区别
1.首先来看这两个的对象方法实现:
//是直接判断该对象的类对象跟传参进来的类对象比较
- (BOOL)isMemberOfClass:(Class)cls {
return [self class] == cls;
}
// 可以看到在实现,用了一个for循环,这方法表示该对象的类对象是否是传参进来类对象的子类
- (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
2.这两个的类方法实现:
object_getClass
这个函数是如果传入的是实例对象
则返回的是类对象
,如果传入的是类对象
则返回的是该类的元类对象
//是直接判断该类对象跟传参进来的元类对象比较
+ (BOOL)isMemberOfClass:(Class)cls {
return object_getClass((id)self) == cls;
}
// 可以看到在实现,用了一个for循环,这方法表示该对象的元类对象是否是传参进来元类对象的子类
+ (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = object_getClass((id)self); tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
总结: isMemberOfClass
isKindOfClass
他们对象方法
表示的是判断的是类对象
,类方法
判断是元类对象
网友评论