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
指针的内存结构。如有任何问题或建议,欢迎留言讨论。
相关文章:
Objective-C 中的 isa 不再是简单的结构体指针
了解 Objective-C 中的 isa 指针内存结构 在 Objective-C 中,isa 指针是对象和类之间的重要桥梁。它不仅帮助运行时系统识别对象的类型,还参与了一些内存和性能优化。本文将深入讲解 isa 指针的内存结构,包括其在早期和现代实现中的演变。 …...
中介子方程五十二
XXFXXaXnXaXXαXLXyXXWXuXeXKXXiXyXΣXXΣXXVXuXhXXWXηXXiXhXXpXiXXpXXbXXpXXiXpXXhXiXXηXWXXhXuXVXXΣXXΣXyXiXXKXeXuXWXXyXLXαXXaXnXaXXFXXaXnXaXXαXLXyXXWXuXeXKXXiXyXΣXXΣXXVXuXhXXWXηXXiXhXXpXiXXpXXbXXpXXiXpXXhXiXXηXWXXhXuXVXXΣXXΣXyXiXXKXeXuXWXXyXLXαXXa…...
LabVIEW在半导体自动化测试中的应用
半导体制造的复杂性和精密度要求极高,每一个生产步骤都需要严格的控制和监测。自动化测试设备在半导体制造中起到了关键作用,通过精密测量和数据分析,确保产品质量和生产效率。本文介绍如何使用LabVIEW结合研华硬件,开发一个用于半…...
政安晨:【Keras机器学习示例演绎】(五十三)—— 使用 TensorFlow 决策森林进行分类
目录 简介 设置 准备数据 定义数据集元数据 配置超参数 实施培训和评估程序 实验 1:使用原始特征的决策森林 检查模型 实验 2:目标编码决策森林 创建模型输入 使用目标编码实现特征编码 使用预处理器创建梯度提升树模型 训练和评估模型 实验…...
51单片机:电脑通过串口控制LED亮灭(附溢出率和波特率详解)
一、功能实现 1.电脑通过串口发送数据:0F 2.点亮4个LED 二、注意事项 1.发送和接受数据的文本模式 2.串口要对应 3.注意串口的波特率要和程序中的波特率保持一致 4.有无校验位和停止位 三、如何使用串口波特率计算器 1.以本程序为例 2.生成代码如下 void Uar…...
Java中的消息中间件选择与比较
Java中的消息中间件选择与比较 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在分布式系统中,消息中间件是一种关键组件,它能帮助不同…...
react基础语法,模板语法,ui渲染,jsx,useState状态管理
创建一个react应用 这里使用create-react-app的脚手架构建项目(结构简洁,基于webpack-cli), npx create-react-app [项目名称] 使用其他脚手架构建项目可以参考:react框架,使用vite和nextjs构建react项目…...
OJ-0710
示例1 input 4 100 200 300 5001 21 32 4output700100 200 500 300 示例2 input 4 100 200 300 500 1 2 1 3 1 4output1100100 200500300 示例3 input 6 100 200 300 400 300 550 1 2 1 3 1 4 2 5 2 6output1050100 200 300600 300400 import java.util.ArrayList; im…...
人工智能在自动驾驶中的目标检测研究
摘要 随着自动驾驶技术的快速发展,视觉识别作为核心技术之一,扮演着至关重要的角色。本文旨在探讨人工智能如何通过视觉识别在自动驾驶中进行目标检测。我们将详细讨论目标检测的基本原理、常用算法、最新进展、已有的开源项目及其在自动驾驶中的应用和…...
【合并两个有序数组】
合并两个有序数组 一、题目二、普通解法三、双指针 一、题目 二、普通解法 先合并后排序 补充:js合并数组方法详见https://blog.csdn.net/ACCPluzhiqi/article/details/131702269?fromshareblogdetail js排序方法见http://t.csdnimg.cn/wVCOP 时间复杂度:O(mn)…...
链表 OJ(一)
移除链表元素 题目连接: https://leetcode.cn/problems/remove-linked-list-elements/description/ 使用双指针法,开始时,一个指针指向头节点,另一个指针指向头节点的下一个结点,然后开始遍历链表删除结点。 这里要注…...
《Linux与Windows文件系统的区别》
Linux与Windows文件系统的区别 在计算机操作系统领域,Linux和Windows是两种广泛使用的操作系统,它们在文件系统方面有许多显著的差异。这篇博客将详细介绍这两种操作系统文件系统的区别,帮助读者更好地理解它们各自的特点和优势。 类别Linu…...
批量修改Git历史commit信息中的username
之前很长一段时间GitHub上的提交都在使用工作账户, 导致私人仓库中的提交者比较混乱. 在StackOver里面找到了一个bash脚本可以批量修改username, 在这里记录一下. 修改的步骤一共两步: 执行修改脚本将本地修改同步到Git服务器 首先我们来看脚本: #!/bin/shgit filter-branch…...
LabVIEW与ABB工业机器人据监控
1. 前言 随着工业自动化的发展,工业机器人在制造业中的应用越来越广泛。为了实现对工业机器人的高效监控和控制,本文介绍了利用OPC(OLE for Process Control)服务器将ABB工业机器人与LabVIEW连接起来的解决方案。通过OPC服务器…...
c++栈内存和堆内存的基本使用
c栈内存和堆内存的基本使用 #include <iostream>// 定义一个简单的结构体 struct Person {std::string name;int age; };int main() {// 栈内存分配int a 10; // 基本数据类型的栈内存分配Person person; // 结构体的栈内存分配person.name "John";person.a…...
快速入门,springboot知识点汇总
学习 springboot 应该像学习一门编程语言一样,首先要熟练掌握常用的知识,而对于不常用的内容可以简单了解一下。先对整个框架和语言有一个大致的轮廓,然后再逐步补充细节。 前序: Spring Boot 通过简化配置和提供开箱即用的特性,…...
Ubuntu20.04系统非root用户安装GAMIT10.71
(测试环境:20240701升级包和20240701数据,解算通过) QQ:8212714 群:302883438群文件(source安装包20240701升级包) 1、首先在计算机中安装VMware Workstation 16 Pro。建议:分配…...
stm32 开发板可以拿来做什么?
STM32开发板可以用来做许多不同的事情,具体取决于您的应用需求和编程能力。我收集归类了一份嵌入式学习包,对于新手而言简直不要太棒,里面包括了新手各个时期的学习方向编程教学、问题视频讲解、毕设800套和语言类教学,敲个22就可…...
latex英文转中文word,及一些latex相关工具分享
前言:想要转换latex生成的英文pdf文件为中文word文件 一、主要步骤 1、文字翻译:直接使用谷歌翻译等辅助将英文翻译成中文即可; 支持英文pdf文件全文翻译,再用迅捷PDF转换器之类的转成word,再手动调整。 https://app…...
EasyOCR: 简单易用的多语言OCR工具
EasyOCR: 简单易用的多语言OCR工具 1. 什么是EasyOCR?2. 使用场景3. 基本使用方法安装示例代码代码解释 4. 结语 1. 什么是EasyOCR? EasyOCR是一个基于Python的开源光学字符识别(OCR)工具,它支持80多种语言的文本识别。该项目由JaidedAI开发,旨在提供一个简单易用但功能强大…...
arm架构安装chrome
在ARM架构设备上安装谷歌软件或应用通常涉及到几个步骤,这取决于你要安装的具体谷歌产品,比如谷歌浏览器、Google Play服务或者是其他谷歌开发的软件。下面我会给出一些常见的指导步骤,以安装谷歌浏览器为例: 在Linux ARM64上安装…...
ETAS工具导入Com Arxml修改步骤
文章目录 前言Confgen之前的更改Confgen之后的修改CANCanIfComComMEcuM修改CanNmCanSMDCMCanTp生成RTE过程报错修改DEXT-诊断文件修改Extract问题总结前言 通讯协议栈开发一般通过导入DBC实现,ETAS工具本身导入DBC也是生成arxml后执行cfggen,本文介绍直接导入客户提供的arxml…...
Apache Kylin模型构建全解析:深入理解大数据的多维分析
引言 Apache Kylin是一个开源的分布式分析引擎,旨在为大数据提供快速的多维分析能力。它通过预计算技术,将数据转化为立方体模型(Cube),从而实现对Hadoop大数据集的秒级查询响应。本文将详细介绍Kylin中模型构建的全过…...
element-plus的文件上传组件el-upload
el-upload组件 支持多种风格,如文件列表,图片,图片卡片,支持多种事件,预览,删除,上传成功,上传中等钩子。 file-list:上传的文件集合,一定要用v-model:file-…...
等保测评视角下的哈尔滨智慧城市安全框架构建
随着智慧城市的兴起,哈尔滨作为东北地区的重要城市,正在积极探索和实践智慧城市安全框架的构建,以确保在数字化转型的过程中,既能享受科技带来的便利,又能有效防范和应对各类网络安全风险。 本文将从等保测评的视角出…...
Java中的数据缓存技术及其应用
Java中的数据缓存技术及其应用 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在现代应用程序中,数据缓存是一种重要的技术手段,用于提…...
SQL 索引
一、索引的基本概念 **索引(Index)**是数据库中一种特殊的数据结构,用于帮助数据库管理系统(DBMS)快速访问数据表中的特定信息。索引类似于书籍的目录,可以加快数据检索的速度。 二、索引的作用 提高查询…...
free第一次成功,第二次失败
问题描述: 在一个函数中存在free,第一次进入此函数没有问题,但是第二次出错 strncpy(pdd_all_data[i].sensor_name,white_list[j].dev_name,strlen(pdd_all_data[i].sensor_name)); 上面代码都是使用strncpy不小心导致double free or corrup…...
各种音频处理器
在HiFi(高保真)音频系统中,通常需要使用一些特定类型的音频处理器,以确保音频信号的高保真和优质输出。以下是一些常见的音频处理器类型及其在HiFi系统中的应用: DAC(数模转换器): …...
深度学习探秘:Transformer模型跨框架实现大比拼
深度学习探秘:Transformer模型跨框架实现大比拼 自2017年Transformer模型问世以来,它在自然语言处理(NLP)领域引发了一场革命。其独特的自注意力机制为处理序列数据提供了全新的视角。随着深度学习框架的不断发展,Tra…...
哪些网站是单页面应用程序/免费搭建网站平台
假设现在有一个二分类问题,先引入两个概念: 真正例率(TPR):正例中预测为正例的比例假正例率(FPR):反例中预测为正例的比例 再假设样本数为6,现在有一个分类器1ÿ…...
设计logo网站免费南蒲四特/竞价推广账户竞价托管
置信概率可以用来评估区间估计的什么性能?当然是可靠性了,P值反映的是显著性。有了参数估计,就会有对应的假设检验;知识结构如下:01. 知识准备假设检验显著性水平的两种理解:1. 显著性水平:通过…...
网站数据库网络错误/友情链接出售
ECMAScript 中描述了原型链的概念,并将原型链作为实现继承的主要方法. 其基本思想就是 利用原型让一个引用类型 继承另一个引用类型的属性和方法. 实现原型链有一种基本模式,大致如下: function SuperType() { //定义父类 this.property true; } …...
海口小程序开发/正规seo关键词排名网络公司
文章目录公共字段自动填充问题分析基本功能实现思路分析代码实现功能测试功能完善思路分析ThreadLocal操作步骤代码实现功能测试思维导图总结新增分类需求分析数据模型前端页面分析代码实现功能测试分类信息分页查询需求分析前端页面分析代码实现功能测试思维导图总结删除分类需…...
wordpress七号技师/怎么创建一个自己的网站
2 通过CBitmap类显示位图 通过CBitmap类显示位图的基本原理是将要显示的位图导入到CBitmap对象中,之后将该对象选入到兼容设备上下文(DC)中,最后将兼容设备上下文在设备上下文中显示。需要注意的是显示位图的代码要写在对话框程序…...
本地wordpress模板编辑/南宁网站推广排名
实验介绍 定时器毫不夸张地说就是单片机的灵魂,因此关于定时器的相关知识是必须掌握的。定时器就是用来计数的,当配置好定时器的频率后,以该频率进行计数,我们一般还要配合中断来进行操作,当定时器计数到我们想要的值…...