iskindOfClass & isMemberOfClass
2020-09-16 本文已影响0人
含笑州
现象
看下面关于iskindOfClass & isMemberOfClass的代码,分析出最终结果
iskindOfClass & isMemberOfClass 类方法调用:
![](https://img.haomeiwen.com/i6203393/4008078c823186c5.png)
iskindOfClass & isMemberOfClass 实例方法调用:
![](https://img.haomeiwen.com/i6203393/d692c0ef7293f79f.png)
打印结果如下
![](https://img.haomeiwen.com/i6203393/b6171da7c46ca755.png)
分析
isKindOfClass 源码解析(类方法 & 实例方法 )
类方法:
![](https://img.haomeiwen.com/i6203393/7a15c30a98e6347e.png)
实例方法:
![](https://img.haomeiwen.com/i6203393/346859d4375ceec3.png)
我们在断点调试源码的时候,我们发现上面的类方法和实例方法是不走的,它的方法如下:
![](https://img.haomeiwen.com/i6203393/0a3a27c10bde1ca5.png)
我们发现NSObject的isa是它自己本身,所以re1和re5为1,LGPerson class的isa是它的元类,所以re3为0,LGPerson alloc的isa是LGPerson class,所以re7为1
isMemberOfClass 源码解析(类方法 & 实例方法 )
类方法:
![](https://img.haomeiwen.com/i6203393/099c1dbea2e2f59c.png)
我们发现它会拿当前类的元类和传入类进行比较,所以re2和re4都为0
实例方法:
![](https://img.haomeiwen.com/i6203393/f485694b3bccde58.png)
我们发现这个方法会拿当前类直接和传入的类进行比较,所以re6和re8都为1
总结
isKindOfClass
元类 --> 根元类 --> 父类 与 传入类的对比
isMemberOfClass
类方法: 当前类的元类 与 传入类 对比
实例方法:当前类 与 传入类 对比