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

news2025/2/26 3:53:23

了解 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 isa
        uintptr_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
@end

int 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.coloradmin.cn/o/1914012.html

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

相关文章

科普文:深入理解Mybatis

概叙 (1) JDBC JDBC(Java Data Base Connection,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。 优点…

openWrt入门(2) - ubus

ubus - 帮助输出 ubus list - 列表 要了解当前总线上正在运行哪些服务&#xff0c;只需使用以下 ubus list 命令即可。这将显示向 RPC 服务器注册的所有命名空间的完整列表&#xff1a; 列表显示如下: 指定服务路径来筛选列表 -v选项 要找出特定服务提供哪些过程/方法及其参…

PDManer使用教程及安装包

以下安装包版本比较低&#xff0c;用习惯了&#xff0c;需要高版本可以去官网下载 链接&#xff1a;https://pan.baidu.com/s/1Hj4zJ0UCcdk0YQTlteVCTQ?pwdv72v 提取码&#xff1a;v72v 使用教程 连接数据库 导入表信息 创建关系图 第一步 第二步 如果列显示不全 &#x…

windows10设置环境变量Path步骤

1、鼠标右键“我的电脑”&#xff0c;点击“属性”&#xff0c;打开控制面板窗口&#xff0c;如图&#xff1a; 2、点击“高级系统设置”&#xff0c;弹出设置窗口&#xff0c;如图&#xff1a; 3、点击底部的“环境变量”&#xff0c;弹出环境变量窗口&#xff0c;如图&#x…

着火智能监测识别摄像机

当今社会&#xff0c;环境安全日益受到重视&#xff0c;而着火作为火灾前兆的重要指示物&#xff0c;其监测和及时处理显得尤为重要。为了有效预防火灾并保障公共安全&#xff0c;研发出一种智能监测识别着火的摄像机成为技术创新的关键之一。 这种着火智能监测识别摄像机利用了…

二维码生成需知:名片二维码尺寸多少合适?电子名片二维码制作方法?

随着数字化时代的到来&#xff0c;二维码在各个领域的应用越来越广泛&#xff0c;名片作为商业交流的重要工具之一&#xff0c;也开始逐渐融入二维码的元素。通过在名片上添加二维码&#xff0c;我们可以轻松实现信息的快速传递和分享。然而&#xff0c;名片二维码的尺寸选择成…

深度学习论文: LLaMA: Open and Efficient Foundation Language Models

深度学习论文: LLaMA: Open and Efficient Foundation Language Models LLaMA: Open and Efficient Foundation Language Models PDF:https://arxiv.org/pdf/2302.13971.pdf PyTorch: https://github.com/shanglianlm0525/PyTorch-Networks 1 概述 本文介绍了LLaMA&#xff0…

身份证二要素API,实名认证领域的创新之选

身份证二要素API&#xff0c;是一种实名认证领域的创新解决方案。通过输入姓名和身份证号&#xff0c;该API可以通过官方权威渠道进行核查&#xff0c;实时校验二要素的一致性&#xff0c;并返回生日、性别、籍贯等详细信息。这篇博文将详细介绍身份证二要素API的使用方法&…

【fastadmin 开发实战】select 级联选择

先看实现的效果 1、表单页面实现级联选择 2、级联选项后台可以编辑添加 前端代码&#xff08;编辑窗口&#xff09;&#xff1a; <div class"form-group"><label class"control-label col-xs-12 col-sm-2">{:__(渠道归属)}:</label><…

swift与Internvl下的多模态大模型分布式微调指南(附代码和数据)

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 基于Dify的智能分类方案&#xff1a;大模型结合KNN算法&#xff08;附代码&#xff…

AD3518 SOP-8封装 单节锂电池保护芯片 可替代XB8608/XB8608A

AD3518 是一款内置 MOSFET 的单节锂电池保护芯片。该芯片具有非常低的功耗和非常低阻抗的内置 MOSFET。该芯片有充电过压&#xff0c;充电过流&#xff0c;放电过压&#xff0c;放电过流&#xff0c;过热&#xff0c;短路&#xff0c;电芯反接等各项保护等功能&#xff0c;确保…

MUNIK解读ISO26262:安全计划

前言 当我们进行功能安全开发时&#xff0c;由于整个项目周期和内容较多&#xff0c;因此需要在项目前期对一些问题提前进行规划&#xff1a;比如功能安全开发具体分为几个阶段&#xff0c;应该怎么去做&#xff1f;对于不同的环节&#xff0c;有哪些人员来执行&#xff1f;资…

@RequestBody注解的使用及源码解析

前言 RequestBody 注解是我们进行JavaEE开发&#xff0c;最常见的几个注解之一&#xff0c;这篇博文我们以案例和源码相结合&#xff0c;帮助大家更好的了解 RequestBody 注解 使用案例 1.自定义实体类 Data NoArgsConstructor AllArgsConstructor public class User {priv…

飞睿智能6公里WiFi图传接收模块,低延迟、抗干扰、高速稳定传输数据,无人机、农田远距离WiFi模块

在科技日新月异的今天&#xff0c;无线通信技术正以前所未有的速度发展&#xff0c;不仅改变了我们的生活方式&#xff0c;还为企业带来了前所未有的商业机遇。今天&#xff0c;我要向大家介绍一款飞睿智能的产品——6公里WiFi图传接收模块&#xff0c;它以其高性能、稳定的传输…

安防综合管理/视频汇聚平台EasyCVR视频监控存储技术:高效稳定的视频数据保障方案

随着科技的飞速发展&#xff0c;视频监控已成为现代社会不可或缺的一部分。无论是城市治安、交通管理&#xff0c;还是商业安保、家庭监控&#xff0c;视频监控都发挥着至关重要的作用。而在这背后&#xff0c;视频监控存储技术则是确保监控数据得以长期保存、高效检索和可靠利…

今天,纷享AI正式发布,开启智能CRM新纪元

纷享销客作为国产CRM中连续四年保持近40%增长的领先品牌&#xff0c;一直在探索AICRM领域的数字化变革。 7月10日&#xff0c;纷享AI产品正式上线。与通用大模型不同&#xff0c;纷享AI是在合规之下&#xff0c;开放性的接入各种大模型平台&#xff0c;并结合纷享销客在营销服…

Python爬虫教程第4篇-使用BeautifulSoup解析html

文章目录 Beautiful Soup简介安装Beautiful Soup快速开始如何使用Beautiful Soup中的对象TagNameAttributes多值属性 NavigableStringBeautifulSoupComment 遍历文档树子节点tag名字.contents 和 .children.descendants.strings 和 stripped_strings 父节点.parent.parents 兄弟…

深入解析RocketMQ的名字服务机制:功能、原理与应用

NameServer 是专为 RocketMQ 设计的轻量级名字服务&#xff0c;它的源码非常精简&#xff0c;八个类 &#xff0c;少于 1000 行代码。 这篇文章&#xff0c; 笔者会从基础概念、Broker 发送心跳包、NameServer 维护路由、Zookeeper vs NameServer 四个模块揭秘名字服务的设计精…

Paimon下载使用和基础操作说明

简介 Apache Paimon 是一种湖格式&#xff0c;支持使用 Flink 和 Spark 构建实时湖仓一体架构 用于流式处理和批处理操作。Paimon创新性地将湖格式与LSM&#xff08;Log-structured merge-tree&#xff09;相结合 结构&#xff0c;将实时流式更新引入 Lake 架构。 Paimon提供以…

力扣 203反转链表

思路 用cur->next指向pre,把链表倒转 cur后移&#xff0c;cur指向原链表的下一个 注意用tmp存储原链表中cur的后一个 class Solution { public: ListNode* reverseList(ListNode* head) { ListNode *cur head; ListNode *pre nullptr; ListNode *tmp; while (cur ! nul…