当前位置: 首页 > news >正文

iOS 中,isa 指针

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

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

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

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找到它的父元类查找实现方法,一路找到基类。

相关文章:

  • 小程序 | 小程序后端用什么语言开发比较好
  • 通讯网关软件024——利用CommGate X2Access实现Modbus TCP数据转储Access
  • ORACLE 19C PDB FOR MYSQL 5.7 部署ogg
  • 1.16.C++项目:仿muduo库实现并发服务器之HttpContext以及HttpServer模块的设计
  • 事务管理 vs. 锁控制:你真的分得清吗?何时使用何种并发控制策略?
  • EfficientDet: Scalable and Efficient Object Detection
  • 多架构环境下docker-compose部署rocketmq单机模式—— 筑梦之路
  • 力扣第39题 组合总和 c++ 回溯剪枝题
  • 需永远在线的游戏公司,如何在线替换开源存储?
  • Docker在边缘计算中的崭露头角:探索容器技术如何驱动边缘计算的新浪潮
  • 家政服务小程序,家政维修系统,专业家政软件开发商;家政服务小程序,家政行业软件开发
  • 设计模式之单例模式
  • 联想G50笔记本直接使用F键功能(F1~F12)需要在BIOS设置关闭热键功能可以这样操作!
  • 使用transformers过程中出现的bug
  • notepad++ 批量替换删除指定字符之后 或者 之前的字符,Notepad+批量替换使用大全
  • vue3学习(七)--- Teleport传送组件
  • 使用Golang实现HTTP代理突破IP访问限制
  • react写一个简单的3d滚轮picker组件
  • postgresql|数据库|恢复备份的时候报错:pg_restore: implied data-only restore的处理方案
  • rabbitMQ的知识点
  • 中美“第二阶段”贸易协定是否会在会谈中提出?商务部回应
  • 夜读丨母亲的手擀面
  • 特色茶酒、非遗挂面……六安皋品入沪赴“五五购物节”
  • 巴基斯坦军方:印度导弹袭击已造成至少3死14伤
  • 福特汽车撤回业绩指引,警告关税或造成15亿美元利润损失
  • 【社论】跑赢12级狂风,敦煌做对了什么