runtime 系统方法

BOOL res1 = [(id)[NSObject class] isKindOfClass:[NSObject class]];//YES

在runtime源码中:

+ (BOOL)isKindOfClass:(Class)cls {

    for(Class tcls = object_getClass((id)self); tcls; tcls = tcls->superclass) {

        if(tcls == cls)return YES;

    }

    return NO;

}

调用类方法:cls为NSObject,而 tcls是第一次先调用object_getClass((id)self)返回objc_class中shiftcls 的isa指针,它指向元类,继续循环在父类查找...一直到Rootclass的元类它的父类指向Rootclass类(NSObject),而cls为NSObject 所以相等

        BOOL res2 = [(id)[NSObject class]isMemberOfClass:[NSObject class]];

在runtime源码:

+ (BOOL)isMemberOfClass:(Class)cls {

    return object_getClass((id)self) == cls;

}

调用类方法:object_getClass((id)self)通过 isa_t的isa.bits进行位运算获取 isa指针指向元类而cls为NSObject类所以不想等

        //BOOL res3 = [(id)[Sark class] isKindOfClass:[Sark class]];

runtime源码:

+ (BOOL)isKindOfClass:(Class)cls {

    for(Class tcls =object_getClass((id)self); tcls; tcls = tcls->superclass) {

        if(tcls == cls)return YES;

    }

    return NO;

}

调用类方法:通过object_getClass((id)self)指向元类与cls不想等,继续循环在父类中...一直走到RootClass元类它的父类指向NSObject截止,而cls为Sark,与NSObject不相等所以返回NO

        //BOOL res4 = [(id)[Sark class] isMemberOfClass:[Sark class]];

runtime源码:

+ (BOOL)isMemberOfClass:(Class)cls {

    return object_getClass((id)self) == cls;

}

调用类方法:object_getClass((id)self)获取指向元类,与NSObject不相等返回NO。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容