【iOS】isKindOfClass和isMemberOfClass方法

本文详细探讨了iOS开发中Objective-C的isKindOfClass和isMemberOfClass两个方法,通过源码分析和流程解析,阐述了它们在类对象、元类和实例对象中的不同行为和判断逻辑,帮助开发者深化对类继承和isa指针的理解。
摘要由CSDN通过智能技术生成

前言

这个归根结底还是在考察我们对isa走向图和类的继承的理解,也就是苹果官方这幅图:
在这里插入图片描述

接下来的函数调用流程请参考这张图。

1 isKindOfClass方法

1.1 objc_opt_isKindOfClass C函数

查看源码可发现,无论是谁调用isKindOfClass方法都会进入这个C函数。(这个C函数位于NSObjective.mm

// Calls [obj isKindOfClass]
// 当obj调用isKindOfClass时,objc_opt_isKindOfClass会被触发
// obj是一个id类型,id是一个objc_object结构体指针,意味着,传进来的可以是时类,也可以是类的实例对象
// otherClass就是isKindOfClass的参数,我们当初传进去的cls
BOOL objc_opt_isKindOfClass(id obj, Class otherClass)
{
   
#if __OBJC2__
    if (slowpath(!obj)) return NO;
    
    Class cls = obj->getIsa();	 // 此处的cls仅是obj的第一个isa
    if (fastpath(!cls->hasCustomCore())) {
   
        
        // otherClass 从obj的ISA开始,依次和ISA的父类比较,直到找到或者父类为nil结束
		// 当父类为nil意味着最后一个和otherClass比较的是NSObject根类。
        for (Class tcls = cls; tcls; tcls = tcls->superclass) {
   
            if (tcls == otherClass) return YES;
        }
        
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值