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.rhkb.cn/news/373515.html

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

相关文章

彩虹小插画:成都亚恒丰创教育科技有限公司

彩虹小插画&#xff1a;色彩斑斓的梦幻世界 在繁忙的生活节奏中&#xff0c;总有一抹温柔的色彩能悄然触动心弦&#xff0c;那就是彩虹小插画带来的梦幻与宁静。彩虹&#xff0c;这一自然界的奇迹&#xff0c;被艺术家们巧妙地融入小巧精致的插画之中&#xff0c;不仅捕捉了瞬…

海外金融机构银行保险证券数字化转型营销销售数字化成功案例讲师培训师讲授开户销售营销客户AI人工智能创新思维

金融机构需要数字营销的主要原因 数字银行、直接存款和移动网络的兴起让客户无需前往当地分行即可轻松办理银行业务。这些举措不仅提升了用户体验&#xff0c;也迫使银行向数字化世界迈进。 金融服务公司需要在数字营销渠道上保持稳固的地位&#xff0c;以免落后于大型机构。…

man手册的安装和使用

man手册 - HQ 文章目录 man手册 - HQ[toc]man手册的使用Linux man中文手册安装man中文手册通过安装包安装通过apt安装 配置man中文手册README使用说明配置步骤 man手册的使用 首先man分为八个目录&#xff0c;每个目录用一个数字表示 1.可执行程序2.系统调用3.库函数4.特殊文…

2024亚太杯中文赛数学建模B题word+PDF+代码

2024年第十四届亚太地区大学生数学建模竞赛&#xff08;中文赛项&#xff09;B题洪水灾害的数据分析与预测&#xff1a;建立指标相关性与多重共线性分析模型、洪水风险分层与预警评价模型、洪水发生概率的非线性预测优化模型&#xff0c;以及大规模样本预测与分布特征分析模型 …

[Linux]安装+使用虚拟机

首先下载&#xff08;提取码 &#xff1a; ssjf&#xff09;虚拟机&#xff08;应该是必须要下载17的了 &#xff0c; 我刚开始下载了15,16的在解决了不兼容的问题后频繁出现蓝屏的 &#xff09; 刚开始我遇见了 小问题 --》 在查看了以下两篇blog就解决了 虚拟机无法打开,…

防火墙安全策略用户认证综合实验

基础配置 1&#xff0c;交换机配置&#xff08;LSW5&#xff09; 划分vlan10和vlan20&#xff0c;将g0/0/1与与防火墙化为trunk干道&#xff0c;使用防火墙路由模式&#xff08;子接口&#xff09;&#xff0c;g0/0/2和g0/0/3化为access链路&#xff0c;分别连接生产区&#xf…

nginx的重定向(rewrite)

1、location 匹配 location匹配的就是后面的URL&#xff0c;对访问的路径做访问控制或者代理转发 共有三个匹配&#xff1a;精确匹配、正则匹配、一般配 a、精确匹配 格式&#xff1a;location/ 对字符串进行完全匹配&#xff0c;必须完全合 c、正则匹配 ^~&#xff1a;前…

【ARMv8/v9 GIC 系列 5.6 -- GIC 超优先级中断详细介绍】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 Interrupt superpriority超优先级中断的特性和应用Physical interface interrupt signalsPhysical Group 1 Non-NMI for Current Security StatePhysical Group 1 for Other Security State, or a Group 0 Non-NMIPhysical Group 1 …

微软发布Win11 21H2七月更新补丁KB5040431,快来体验!

系统之家于7月10日发出最新报道&#xff0c;微软为Win11 21H2用户发布了七月的安全更新补丁KB5040431。用户升级系统后&#xff0c;会发现版本号升至22000.3079。此次更新针对远程桌面MultiPoint Server在争用条件会导致服务停止响应等多个问题进行修复。接下来跟随小编看看此次…

Python 中创建当前日期和时间的文件名技巧详解

概要 在日常开发中,经常需要创建带有当前日期和时间的文件名,以便进行日志记录、数据备份或版本控制等操作。Python 提供了丰富的库和函数,可以方便地获取当前日期和时间,并将其格式化为字符串,用于生成文件名。本文将详细介绍如何使用 Python 创建带有当前日期和时间的文…

使用ifconfig命令获取当前服务器的内网IP地址

如何使用ifconfig命令获取当前服务器的内网IP地址呢&#xff1f; ifconfig eth0 | grep inet | awk {print $2}

汇川CodeSysPLC教程03-2-14 与HMI通信

硬件连接 PLC与HMI连接采用何种连接方式&#xff0c;通常是参考双方支持哪些接口。PLC&#xff08;可编程逻辑控制器&#xff09;与HMI&#xff08;人机界面&#xff09;之间的通讯方式主要有以下几种&#xff1a; 串行通讯&#xff08;Serial Communication&#xff09;&…

基于ARM Cortex-M3单片机研发的国产指纹芯片 - P1032BF1

智能指纹锁的核心部件&#xff1a;主板、离合器、指纹采集器、密码技术、微处理器&#xff08;CPU&#xff09;、智能应急钥匙。作为指纹锁来说&#xff0c;重要的应该是指纹芯片。指纹锁是通过电子部件及机械部件的精密组合而生产出的安全产品。指纹锁的本质无非是安全、便捷、…

深入理解 Java 中的 try with resources

一、摘要 try-with-resources是 JDK 7 中引入的一个新的异常处理机制&#xff0c;它能让开发人员不用显式的释放try-catch语句块中使用的资源。 比如&#xff0c;我们以文件资源拷贝为示例&#xff0c;大家所熟悉的try-catch-finally写法如下&#xff1a; public class Reso…

看到指针就头疼?这篇文章让你对指针有更全面的了解!

文章目录 1.什么是指针2.指针和指针类型2.1 指针-整数2.2 指针的解引用 3.野指针3.1为什么会有野指针3.2 如何规避野指针 4.指针运算4.1 指针-整数4.2 指针减指针4.3 指针的关系运算 5.指针与数组6.二级指针7.指针数组 1.什么是指针 指针的两个要点 1.指针是内存中的一个最小单…

(HAL)stm32f407+freertos通过usb驱动移远4G模块-EC600U

概述 本篇文章主要介绍: 如何使用STM32CubeMX创建stm32F407+freertos+usb host的基础工程。USB-HOST-CDC驱动运行过程。如何根据4G模块的具体信息修改usb相关代码。MCU如何通过usb与4G模块通信,收发数据。调试过程中遇到的问题以及解决办法。 整个过程中在网上搜罗了很多参考…

suricata7 rule加载(三)加载options

suricata7.0.5 加载options (msg:“HTTP Request Example”; flow:established,to_server; http.method; content:“POST”; http.uri; content:“query.php”; bsize:>9; http.protocol; content:“HTTP/1.1”; bsize:8; http.host; content:“360”; bsize:>3; class…

LabVIEW自动测控与故障识别系统

使用LabVIEW 2019在Win10 64位系统上开发自动测控软件&#xff0c;通过与基恩士NR-X100数据采集仪通讯&#xff0c;实时采集和分析数据&#xff0c;自动识别判断产品是否合格&#xff0c;并增加数据记录和仿真功能。 具体解决方案&#xff1a; 1. 系统架构设计 硬件接口&#…

IP 地址:优化网络游戏

IP地址和网络游戏 在现代网络游戏中&#xff0c;IP地址不仅用于服务器分配&#xff0c;还能针对性进行玩家匹配与优化网络延迟。本文将探讨IP地址在网络游戏中的具体应用。 *服务器分配* 全球服务器分布&#xff1a; 网络游戏需要在全球范围内提供快速、稳定的连接&#xff…