iOS 中,isa 指针

每个对象都有 isa 指针,指向对象所属的类。例如类 NSString 其实是类对象

类对象产生于编译期,单例。

类对象 有 isa 指针指向对应元类, 元类(metaclass)中保存了创建类对象以及类方法所需的所有信息。
struct objc_classs结构体里存放的数据称为元数据(metadata)

objectivec 复制代码
struct objc_class {
    Class isa  OBJC_ISA_AVAILABILITY;

#if !__OBJC2__
    Class super_class                                        OBJC2_UNAVAILABLE;
    const char *name                                         OBJC2_UNAVAILABLE;
    long version                                             OBJC2_UNAVAILABLE;
    long info                                                OBJC2_UNAVAILABLE;
    long instance_size                                       OBJC2_UNAVAILABLE;
    struct objc_ivar_list *ivars                             OBJC2_UNAVAILABLE;
    struct objc_method_list **methodLists                    OBJC2_UNAVAILABLE;
    struct objc_cache *cache                                 OBJC2_UNAVAILABLE;
    struct objc_protocol_list *protocols                     OBJC2_UNAVAILABLE;
#endif

} OBJC2_UNAVAILABLE;
/* Use `Class` instead of `struct objc_class *` */

真正的源头

root class(meta)指向 Root class 类对象,Root class 类对象指向 nil,形成自闭环。

NSObject 就是 RootClass

总结:

  1. 实例对象(instance)的 isa 指向类对象(class)
  2. 类对象(class)的 isa 指向元类对象(meta-class)
  3. class 的 superclass指向父类的class
  4. meta-class的superclass指向父类的meta-class,根的 meta-class 的 superclass 指向根的class
  5. instance调用对象方法的轨迹:isa找到class,方法不存在,就通过superclass找父类
  6. class调用类方法的轨迹:isa找meta-class,方法不存在,就通过superclass找父类

方法调用相关

当调用对象方法时,实例对象内存并没有包含对象方法,而是通过它内部的isa指针找到它的类对象,从而在类对象中找到对象方法的实现进行调用。

当调用类方法时,类对象并没有类方法的信息,而是通过类对象的isa找到元类对象,最后找到类方法的实现进行调用

子类为什可以调用父类方法:

  1. 当实例对象调用对象方法会通过isa找到它的类对象,然后在类对象找方法实现,然而有时候这个类对象并没方法实现,那么就会通过superclass找到它的父类查找实现方法,一路找到基类。
  2. 当类调用类方法时会通过isa找到它的元类对象,然后在元类类对象找方法实现,然而有时候这个元类对象并没方法实现,那么就会通过superclass找到它的父元类查找实现方法,一路找到基类。
相关推荐
张元清20 分钟前
告别 Promise.all 的依赖困境:better-all 如何优雅管理异步任务
前端·javascript·面试
开源之眼20 分钟前
github star 加星多的从 React 到 Web3D:前端开发者的三维世界入门指南
javascript·面试
a努力。1 小时前
虾皮Java面试被问:JVM Native Memory Tracking追踪堆外内存泄漏
java·开发语言·jvm·后端·python·面试
ii_best1 小时前
安卓/ios脚本开发辅助工具按键精灵横纵坐标转换教程
android·开发语言·ios·安卓
努力学算法的蒟蒻2 小时前
day57(1.8)——leetcode面试经典150
算法·leetcode·面试
辞砚技术录3 小时前
MySQL面试题——索引、B+树
数据结构·数据库·b树·面试
Baihai_IDP3 小时前
Andrej Karpathy:2025 年 LLM 领域的六项范式转变
人工智能·面试·llm
Dontla3 小时前
Mock Interview模拟面试,20260108,MNC第二面技术面,AI Engineer
人工智能·面试·职场和发展
先飞的笨鸟4 小时前
2026 年 Expo + React Native 项目接入微信分享完整指南
前端·ios·app
Jing_Rainbow4 小时前
【 前端三剑客-35 /Lesson58(2025-12-08)】JavaScript 原型继承与对象创建机制详解🧬
前端·javascript·面试