【iOS笔记】【16】isKindOfClass与isMemberOfClass
本文最后更新于:2021年12月22日 中午
【主页】系列文章目录
【iOS笔记】系列目录
一 Code
说明:Test直接继承自NSObject
1 |
|
二 源码
0.源码解析
1 |
|
总结:
object_getClass(obj)
返回的是obj的isa指针;
[obj class]
则分两种情况:
obj为实例对象
调用的是实例方法:- (Class)class
,返回的obj对象中的isa指针;
- obj为类对象(包括元类和根类以及根元类)
调用的是类方法:+ (Class)class
,返回的结果为其本身。
参考:【iOS笔记】【3】class方法和objc_getClass方法
1.isKindOfClass
是否是当前类或当前类的子类实例
Returns a Boolean value that indicates whether the receiver is an instance of given class or an instance of any class that inherits from that class.
判定依据
实例对象调用isKindOfClass
沿继承链获取isa(类对象),判定class与继承链上获取的isa是否有相等的
类对象调用isKindOfClass
沿继承链获取isa(元类对象),判定class与继承链上获取的isa是否有相等的
2.isMemberOfClass
是否是给定类的实例
Returns a Boolean value that indicates whether the receiver is an instance of a given class.
isMemberOfClass的源码实现是拿到自己的isa指针和自己比较,是否相等。
总结一下判定流程
结合上图1,共有三列,第一列实例对象,第二列类对象,第三列元类对象。
+ (BOOL)isKindOfClass:(Class)cls;
类方法,沿着继承链,去判定isa(类对象isa是元类)和参数是否相等,即判定第三列的所有元类以及根元类的父类NSObject是否有能和参数匹配的。
参见res7的判定流程- (BOOL)isKindOfClass:(Class)cls;
实例方法,沿着继承链,去判定isa(实例对象isa是类)和参数是否相等,即判定第二列的所有类以及根类NSObject是否有能和参数匹配的。
参见res5的判定流程+ (BOOL)isMemberOfClass:(Class)cls;
类方法,判定isa(元类)和参数是否相等,只判定一次,判定元类,即第三列是否有能和参数匹配的。
参见res2的判定流程- (BOOL)isMemberOfClass:(Class)cls;
实例方法,判定isa(类)和参数是否相等,只判定一次,判定元类,即第二列是否有能和参数匹配的。
参见res6的判定流程
联系方式
邮箱: xiebangyao_1994@163.com
相关账号:
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!