isKingOfClass 和 isMemberOfClass详解
isKindOfClass:确定一个对象是否是一个类的成员,或者是派生自该类的成员.
isMemberOfClass:确定一个对象是否是当前类的成员.
代码示例:
+ (Class)class {
return self;
}
+ (BOOL)isKindOfClass:(Class)cls分析
调用者会从当前类对象的isa一直往上走,知道找到cls或者superclass为nil才会结束,当superclass为nil,说明根类nsobject不是cls ,返回false
文字描述:
从类的isa----元类开始,判断它是不是cls
如果是,返回yes
如果不是,继续用元类的superclass和cls比较,是的话,返回yes
直到根元类nsobject为nil截止。
判断顺序:subclass -> metaClass(元类) -> metaClass(元类) - >... -> root metaClass(根元类) -> nsobject
注意:类对象调用方法的本质 是判断cls是否是元类的继承链中的任意一个实例对象
元类meteclass调用isKindOfClass
文字描述:
元类的isa指向rootmetaClass,从rootmetaClass开始判断是否是cls,如果不是,则用根类nsobject进行判断是不是cls,是的话,返回ture,不是则返回false
判断顺序: meteclass - > rootmetaClass(根元类) -> nsobject
当对象obj
调用- (BOOL)isKinsOfClass:(Class)cls
文字描述:
从isa指向的类对象、类对象的父类,逐级往上进行判断,是cls返回ture,如果执行到nsobject仍然不是,则返回false。
判断顺序:object -> SubClass -> SubClass ->...->NSObject
isMemberofClass
当类
调用 +(BOOL)isMemberofClass:(Class)clss
+ (BOOL)isMemberOfClass:(Class)cls {
return self->ISA() == cls;
}
判断当前类是不是cls,只判断一次,是的返回true,
注意 如果是类对象SubClass
调用isMemberofClass :传入任何类对象都是false,因为类的isa不指向类对象
如果是元类MetaClass
调用isMemberofClass:传入任何类对象也都是false
当对象obj
调用 -(BOOL)isMemberofClass:(Class)clss
- (BOOL)isMemberOfClass:(Class)cls {
return [self class] == cls;
}
- (Class)class {
return object_getClass(self); // 获取当前的isa指向的类
}
- 只判断自己的类对象是不是传入的cls
- 只接受类对象传入 ,因为没有isa,不存在元类的介入
总结:
当调用者是 ------ 类对象subclass
+(BOOL)isKindOfClass:(Class)cls
判断cls是不是 subclass -> metaClass(元类) -> metaClass(元类) - >... -> root metaClass(根元类) -> nsobject (元类的superclass继承链)其中一个
+(BOOL)isMemeberOfClass:(Class)cls
判断cls是不是自己的isa
当调用者是——元类MetaClass
+(BOOL)isKindOfClass:(Class)cls
判断cls是不是 meteclass - > rootmetaClass(根元类) -> nsobject其中一个
+(BOOL)isMemeberOfClass:(Class)cls
判断cls是不是根元类
当调用者是——对象Obj
+(BOOL)isKindOfClass:(Class)cls
判断cls是不是 object -> SubClass -> SubClass ->...->NSObject
(元类的superclass继承链)其中一个
+(BOOL)isMemeberOfClass:(Class)cls
判断cls是不是自己的类(类对象)