iOS 中,isa 指针

news/2024/11/15 8:40:16/

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

http://www.ppmy.cn/news/1158052.html

相关文章

【算法|前缀和系列No.3】leetcode LCR 012. 寻找数组的中心下标

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【leetcode)】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望…

基于nodejs+vue网课学习平台

各功能简要描述如下: 1个人信息管理:包括对学生用户、老师和管理员的信息进行录入、修改,以及老师信息的审核等 2在库课程查询:用于学生用户查询相关课程的功能 3在库老师查询:用于学生用户查询相关老师教学的所有课程的功能。 4在库学校查询:用于学生用户查询相关学…

Drecom 的《Eternal Crypt - Wizardry BC -》加入 The Sandbox 啦!

经典 “Wizardry” 游戏系列的新区块链迭代将通过全球合作拓展 Web3 游戏宇宙。 我们非常高兴地宣布,沙盒游戏公司与富有远见的传奇游戏《Wizardry》系列创造者 Drecom 将建立充满活力的合作伙伴关系。我们将共同推出《Eternal Crypt - Wizardry BC -》&#xff0c…

武汉凯迪正大—全自动变比测试仪

产品介绍 武汉凯迪正大KDB-IV全自动变比组别测试仪可有效监督变压器产品出厂及使用过程中的质量,防止变压器匝间短路,开路,连接错误,调压开关内部故障或接触故障。 KDB-IV全自动变比组别测试仪在原基础上根据用户的现场使用要求…

JAVA发送消息到RabbitMq

项目中&#xff0c;作为生产者自定义消息发送到RabbitMq。 1.引入rmq依赖 <!-- rabbitmq 依赖 --><dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.9.0</version></dependen…

基于 nodejs+vue网上考勤系统

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

lv8 嵌入式开发-网络编程开发 18 广播与组播的实现

目录 1 广播 1.1 什么是广播&#xff1f; 1.2 广播地址 1.3 广播的实现 2 组播 2.1 分类的IP地址 2.2 多播 IP 地址 2.3 组播的实现 1 广播 1.1 什么是广播&#xff1f; 数据包发送方式只有一个接受方&#xff0c;称为单播 如果同时发给局域网中的所有主机&#xff0…

ArcGis打开影像显示全黑解决方法

我们加载图像&#xff0c;显示如下&#xff1a; 解决方法&#xff1a; 问题分析&#xff1a;Gamma值高于1影像亮化&#xff0c;低于1影像暗化。栅格影像导入进来呈现黑色&#xff0c;可能是因为影像的“Gamma校正”设置出现问题&#xff0c;影响了影像的拉伸度、亮度、对比度等…