2021-03-24

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指向的类
}
  1. 只判断自己的类对象是不是传入的cls
  2. 只接受类对象传入 ,因为没有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是不是自己的类(类对象)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值