Objective-C 中的 isa 不再是简单的结构体指针

了解 Objective-C 中的 isa 指针内存结构

在 Objective-C 中,isa 指针是对象和类之间的重要桥梁。它不仅帮助运行时系统识别对象的类型,还参与了一些内存和性能优化。本文将深入讲解 isa 指针的内存结构,包括其在早期和现代实现中的演变。

什么是 isa 指针?

每个 Objective-C 对象都有一个 isa 指针,它指向对象的类对象。类对象本身也是一个对象,它的 isa 指针指向一个元类对象(meta-class)。元类对象存储类方法,并且其 isa 指针最终指向根元类(通常是 NSObject 的元类)。

早期的 isa 指针结构

在早期的 Objective-C 实现中,isa 指针简单地指向类对象的结构体。以下是一个典型的早期实现示例:

struct objc_object {Class isa; // 指向类对象的指针
};typedef struct objc_class *Class; // Class 的本质是 objc_class 类型的结构体指针
struct objc_class {Class isa; // 指向元类对象的指针Class super_class; // 指向父类对象的指针// 其他类相关的元数据
};

在这种结构下:

  • 对象的 isa 指针指向类对象。
  • 类对象的 isa 指针指向元类对象。
  • 元类对象的 isa 指针指向根元类对象。

现代 isa 指针结构

在 64 位系统和现代 Objective-C 运行时中,isa 指针被重新设计为一个更复杂的联合体(union isa_t),它不仅包含指向类对象的指针,还包含其他标志位和信息,以优化内存使用和性能。以下是 isa_t 结构的一个简化示例:

union isa_t {isa_t() { }isa_t(uintptr_t value) : bits(value) { }Class cls; // 指向类对象的指针uintptr_t bits; // 包含位域信息的位模式struct {uintptr_t nonpointer        : 1;  // 是否启用优化的 non-pointer isauintptr_t has_assoc         : 1;  // 是否有关联对象uintptr_t has_cxx_dtor      : 1;  // 是否有 C++ 析构函数uintptr_t shiftcls          : 33; // 类指针(经过位移和压缩)uintptr_t magic             : 6;  // 调试用的魔数uintptr_t weakly_referenced : 1;  // 是否被弱引用uintptr_t deallocating      : 1;  // 是否正在释放uintptr_t has_sidetable_rc  : 1;  // 是否有辅助引用计数表uintptr_t extra_rc          : 19; // 额外的引用计数};
};

结构字段解释

  • nonpointer:指示 isa 是否为非指针类型(优化内存布局,存储额外信息)。
  • has_assoc:对象是否有关联引用(Associative References)。
  • has_cxx_dtor:对象是否有 C++ 析构函数,需要调用析构函数。
  • shiftcls:类指针,存储对象的类信息(经过位移和压缩)。
  • magic:用于调试和运行时验证的魔数(magic number)。
  • weakly_referenced:对象是否被弱引用指向。
  • deallocating:对象是否正在被释放。
  • has_sidetable_rc:对象的引用计数是否存储在辅助表(Side Table)中。
  • extra_rc:额外的引用计数,用于优化内存占用。

引用计数的存储与管理

在早期的 Objective-C 实现中,引用计数通常作为对象结构的一部分直接存储在对象中。例如:

struct objc_object {Class isa; // 指向类对象的指针uintptr_t retainCount; // 引用计数
};

在现代的 Objective-C 运行时中,引用计数通过 isa 指针的优化结构和 Side Table 辅助数据结构进行管理。

  • Inline Reference Counting:部分引用计数信息被存储在 isa 指针的优化结构中,例如 extra_rc 字段。
  • Side Table:当引用计数超出 isa 指针所能表示的范围时,引用计数会存储在一个称为 Side Table 的辅助数据结构中。

Modern isa 指针的优势

  • 内存优化:通过将更多信息(如引用计数、标志位)存储在 isa 指针中,减少了对其他内存区域的访问,提升了性能。
  • 性能提升:减少了内存读取操作,因为可以在一次内存读取中获取更多信息。
  • 更丰富的元数据:可以包含更多运行时信息,有助于提高运行时的灵活性和效率。

使用示例

虽然开发者在日常编码中通常不直接与 isa 指针交互,但理解其结构对于调试和优化性能是有帮助的。以下是一个使用示例,通过访问对象的类信息来显示对象的类型:

#import <Foundation/Foundation.h>
#import <objc/runtime.h>@interface MyClass : NSObject
@end@implementation MyClass
@endint main(int argc, const char * argv[]) {@autoreleasepool {MyClass *obj = [[MyClass alloc] init];Class cls = object_getClass(obj);NSLog(@"Class name: %s", class_getName(cls));// 访问 isa 指针信息(需要通过运行时函数)NSLog(@"isa pointer: %p", *(uintptr_t *)obj);}return 0;
}

总结

isa 指针在 Objective-C 运行时中扮演着重要角色,从早期简单的指向类对象,到现代复杂的 isa_t 结构,它帮助优化了内存使用和性能。理解 isa 指针的演变和内存结构,可以帮助我们更好地掌握 Objective-C 的运行时机制,并编写高效的代码。

希望这篇文章能帮助你深入了解 Objective-C 中 isa 指针的内存结构。如有任何问题或建议,欢迎留言讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/43541.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Transformer 论文通俗解读:FFN 的作用

在经过前面3节关于 Transformer 论文的解读之后&#xff0c;相信你对提出 Transformer 架构的这篇论文有了一定的了解了&#xff0c;你可以点击下面的链接复习一下前3节的内容。 《Attention is all you need》通俗解读&#xff0c;彻底理解版&#xff1a;part1 《Attention …

合合信息“大模型加速器”亮相2024世界人工智能大会

文章目录 &#x1f4d1;引言一、大模型发展的挑战数据稀缺问题 二、大模型“加速器”解决方案概述文档解析引擎的特征 三、文档解析引擎的优势3.1 高速处理能力3.2 智能理解文档结构3.3 多种数据类型支持3.4 高精度数据提取3.5 应用广泛&#xff0c;适应性强 四、复杂图表解析4…

Auslogics Disk Defrag Pro v11激活版下载、安装、使用教程 (磁盘碎片整理工具)

前言 Auslogics Disk Defrag Pro 是一款支持 FAT16 文件系统的磁盘碎片整理工具&#xff0c;它可以快速整理磁盘碎片&#xff0c;使磁盘空间更加整洁&#xff0c;显著提升电脑的运行速度。该软件无需任何分析阶段&#xff0c;并且速度比大多数其他碎片整理软件更快。它可以帮助…

stm32 开发板可以拿来做什么?

STM32开发板可以用来做许多不同的事情&#xff0c;具体取决于您的应用需求和编程能力。我收集归类了一份嵌入式学习包&#xff0c;对于新手而言简直不要太棒&#xff0c;里面包括了新手各个时期的学习方向编程教学、问题视频讲解、毕设800套和语言类教学&#xff0c;敲个22就可…

详解太阳能控制器PWM / MPPT极简方案其设计要点,台湾远翔FP7209升压24V,30V,36V,42V,48V

文章目录 前言 一、单节电池升压9V、12V、24V方案 二、单节电池升压30V&#xff0c;36V&#xff0c;42V&#xff0c;48V方案 三、芯片介绍 FP7209X与FP7209M的区别&#xff1a; 四、单节电池升压成为市面上太阳能控制器首选的原因&#xff1f; 总结 前言 太阳能是一种环保…

定时器TIM配置微妙延时函数

定时器TIM配置微妙延时函数 文章目录 定时器TIM配置微妙延时函数开胃小菜&#xff08;BOOT0、BOOT1&#xff09;Boot0Boot1&#xff08;如果有&#xff09; 三种定时器高级控制定时器&#xff08;TIM1&#xff0c;TIM8&#xff09;通用定时器&#xff08;TIM2, TIM3, TIM4, TIM…

基于Intel Chainer 和姿势检测的动作识别(人体、面部、手部关键点识别动作识别)

项目概述 目标 开发一个能够实时或近实时识别特定动作的系统&#xff0c;如运动姿势、表情变化或手势控制。实现对人体关键点的精确追踪&#xff0c;以便于分析和理解人的动态行为。 技术栈 Intel硬件&#xff1a;可能使用Intel的高性能计算平台&#xff0c;如Xeon处理器或…

【国潮】国产化系统甲方问题总结

持续更新。。。。。。。。。。。。。。。 【国潮】国产化系统甲方问题总结 1. 安全性问题2. 可靠性和稳定性问题3. 性能问题4. 符合军事标准问题5. 兼容性和集成问题6. 维护和升级问题7. 项目管理问题8. 隐私和合规性问题9. 灾难恢复和备份问题10. 技术支持和培训问题 引言&am…

zookeeper的shell操作

一&#xff1a;启动拽库的shell命令行 zkCli.sh -server localhost:2181 退出&#xff1a;quit 二&#xff1a;查询所有的命令 help 三&#xff1a;查询对应的节点 --查询zk上的根节点 ls / ls /zookeeper 四&#xff1a;查询对应节点的节点信息&#xff08;节点的元数据&a…

[AI 大模型] 阿里巴巴 通义千问

文章目录 [AI 大模型] 阿里巴巴 通义千问简介模型架构发展新技术和优势示例 [AI 大模型] 阿里巴巴 通义千问 简介 阿里巴巴的 通义千问 是由阿里云开发的一款大型语言模型&#xff0c;旨在为用户提供高效、智能的自然语言处理服务。 通义千问能够处理多种语言输入&#xff0c…

免杀笔记 ---> Session0--DLL注入

刚更新完上一篇&#xff0c;于是我们就马不停蹄的去跟新下一篇&#xff01;&#xff01; Session0注入 &#xff1a;&#xff1a; 各位看官如果觉得还不错的可以给博主点个赞&#x1f495;&#x1f495; 这次&#xff0c;我把这个脚本直接传到Github上了 喜欢的师傅点个Star噢…

【C++报错已解决】Dangling Pointer

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一&#xff1a;使用智能指针2.2 方法二…

本地部署,GFPGAN: 实用的面部修复算法

目录 什么是 GFPGAN&#xff1f; 技术原理 主要功能 应用场景 本地安装 运行结果 结语 Tip&#xff1a; 在图像处理和计算机视觉领域&#xff0c;面部修复是一个重要且具有挑战性的研究方向。随着深度学习技术的不断进步&#xff0c;许多新的算法被提出&#xff0c;用于…

Python8:线程和进程

1.并发和并行 并发&#xff1a;在逻辑上具备同时处理多个任务的能力&#xff08;其实每时刻只有一个任务&#xff09; 并行&#xff1a;物理上在同一时刻执行多个并发任务 2.线程与进程 一个进程管多个线程&#xff0c;一个进程至少有一个线程 python多线程是假的&#xf…

【漏洞复现】docassemble——interview——任意文件读取

声明&#xff1a;本文档或演示材料仅供教育和教学目的使用&#xff0c;任何个人或组织使用本文档中的信息进行非法活动&#xff0c;均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 docassemble 是一款强大的开源工具&#xff0c;它让自动化生成和…

linux_进程概念——理解冯诺依曼体系结构

前言&#xff1a; 本篇内容是为了让友友们较好地理解进程的概念&#xff0c; 而在真正了解进行概念之前&#xff0c; 要先了解一下冯诺依曼体系结构。 所以博主会先对冯诺伊曼体系结构进行解释&#xff0c; 然后再讲解进程的概念。 ps&#xff1a; 本篇内容适合了解一些linux指…

openfoam生成的非均匀固体Solid数据分析、VTK数据格式分析、以及paraview官方用户指导文档和使用方法

一、openfoam生成的非均匀固体Solid数据分析 对于Solid/dealii-output文件&#xff0c;固体的数据文件&#xff0c; # vtk DataFile Version 3.0 #This file was generated by the deal.II library on 2024/7/10 at 9:46:15 ASCII DATASET UNSTRUCTURED_GRIDPOINTS 108000 do…

go1.21版本后,文件加载顺序

总结 显式引入&#xff1a; 同一个文件显式引入一个包&#xff0c;按照页面代码执行的函数的先后&#xff0c;来执行该函数的文件&#xff0c;不按照包内的文件首字母顺序 隐式引入&#xff1a; 同一个文件内隐式引入一个包&#xff0c;包内的多个文件会按照文件首字母顺序执行…

Qt(五)网络编程

文章目录 一、QTcpServer类&#xff08;一&#xff09;使用&#xff08;二&#xff09;示例1. 服务端2. 客户端&#xff1a; 二、 一、QTcpServer类 QTcpServer类用于监听客户端的连接&#xff0c;每当有一个客户端连接到服务端&#xff0c;都会生成一个新的QTcpSocket对象与客…

【每日一练】python面对对象的基本概念和用法(附实例)

面向对象编程&#xff08;OOP&#xff09;是一种程序设计方法&#xff0c;其基本概念包括对象、类、继承和封装。 对象&#xff1a;对象是系统中的基本单位&#xff0c;用于描述客观事物。每个对象包含一组属性和对这些属性进行操作的方法。对象是类的一个实例&#xff0c;具有…