iOS底层探索02-对象的底层探索

本文深入探讨了Objective-C中影响对象内存分配的因素,包括属性顺序、内存对齐和位域的使用。讲解了nonPointerIsa在64位系统中的布局,以及如何通过位域运算获取类对象。同时,介绍了new方法的本质是alloc+init的组合。通过实例分析了内存分配的细节,展示了内存优化的重要性。
摘要由CSDN通过智能技术生成

对象底层探索

  1. 影响对象内存的因素
  2. 对象内存的分布
  3. 联合体、位域
  4. nonPointerisa
  5. 如何利用isa的位域运算得到类对象
  6. new 方法

影响对象内存的因素

首先介绍打印指令

p 和 po
p是LGPerson的一个对象p是LGPerson的一个对象,通过截图可以看出不一样
想打印10进制的是 p/x ,
8进制的是p/o
2进制的是p/t
打印浮点的是p/f

然后介绍一个x指令,它能打印出对象地址
其中x/4gx :以16进制单位去打印后面的对象的4个8字节地址
x/6gx:以16进制单位去打印后面的对象的6个8字节地址

然后看一段代码:

LGPerson * p = [LGPerson new];
p.name = @"JJ"; //8 0-7
p.hobby = @"girl": //8 8-15
p.hight = 1.8.0  //8 16-23
p.age = 22;//4 24-27
p.number = 111;//4 28-31
p.a = 5;//32-33 + isa 8 34-41 因为要为16的整数倍所以是48
NSLog (@"%lu",malloc_size((__bridge const void *)(p)));

创建这么一个对象p ,通过给p的属性赋值,通过计算我们可以看到系统给分配的内存是48 ,name和hobby是NSString 8字节 *2 ,hight是long 8字节,age和number 是int4字节,a是short 2字节,每隔对象都有一个isa 8字节。可以计算得到系统会给其分配48字节(具体规则可以查看上一个篇章)。
然后打印对象p
在这里插入图片描述
系统在分配内存的时候是遵循小端原则的,而且会把加起来不足8字节的属性放到一起。所以平时写代码的时候 对于属性的顺序并不需要过多的在意因为在编译时候系统会帮我们去优化好。但是这里有一块要注意,由于子类没有办法修改父类的内存空间,所以在有继承我们自己创建的基类的时候还是需要我们自己去控制好父类的内存空间。

联合体和位域
struct struct1 {
	char a ;
	char b ;
	char c ;
	char d ;
}struct1 // ===> 4字节
struct struct2 {
	char a :1;//位域
	char b :1;
	char c :1;
	char d :1;
}struct2 // ===> 1字节

像struct2 的表达方式就是位域 ,有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态,用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示 注意位域的位数不可以超过数据类型的最大长度,像char a:1 ,位域就不可以超过1字节,其中1字节最多可以分成8位。:0表示不使用。

联合体:
开辟一块公用内存空间,读取的时候只显示读取类型的值,其他类型的值显示为乱码或者不显示。

union struct3{
	char *name;
	int age;
	double height;
}struct3

1.联合体必须能够容纳最大的成员变量
2.通过计算的大小必须是最大的成员变量的整数倍
结构体和联合体的区别在于,结构体里面的成员变量可以共存,但是内存开辟比联合体多;联合体的成员变量是互斥的,能节省一定内存空间;

nonPointer_Isa

nonPointerIsa : 特殊指针
8(字节)* 8 = 64(位)
64位存储
(oc底层c++释放,如果c++没有释放,就不是释放)
小端模式 所以从右往左读(存)ULL(无符号长整型)
64位的字节里面除了储存类对象的内存对象地址,还有引用计数 还有其他
isa使用联合体就是为了兼容以前的版本

nonpointer:表示是否对isa指针开启指针优化
0:纯isa指针
1:不止是类对象地址,isa包含了类消息、对象的引用计数器等
has_assoc:关联对象标志位,0没有1存在
has_cxx_dtor:该对象是否有C++或者Objc的析构器,如果有析构器则需要析构逻辑,没有则可以更快释放对象
shiftcls:存储类指针的值。开启指针优化下,在arm64架构中有33位来储存类指针
magic:用于调试器判断当前对象真的对象还是没有初始化的空间
weakly_referenced:标志对象是否被指向或者曾经指向一个ARC的弱变量,没有弱引用对象可以更快的释放
deallocating:标志对象是否正在释放内存
has_sidetable_rc:当对象引用计数大于extra_rc所能储存的最大范围时,需要借用该变量储存进位
extra_rc:当表示该对象的引用计数值,当对象的因技术超出最大的储存范围时,则需要使用上面的has_sidetable_rc

如何利用isa的位域运算得到类对象

uintptr_t shiftcls , 打比方当前uintptr_t shiftcls为33 ,isa总长64位 中间的这33位就是类对象的地址,如果计算出来呢
在这里插入图片描述

new 方法

在源码中可以看到在这里插入图片描述
所以new 其实就是alloc + init方法
在这里插入图片描述

数据治理是确保数据准确性、可靠性、安全性、可用性和完整性的体系和框架。它定义了组织内部如何使用、存储、保护和共享数据的规则和流程。数据治理的重要性随着数字化转型的加速而日益凸显,它能够提高决策效率、增强业务竞争力、降低风险,并促进业务创新。有效的数据治理体系可以确保数据在采集、存储、处理、共享和保护等环节的合规性和有效性。 数据质量管理是数据治理中的关键环节,它涉及数据质量评估、数据清洗、标准化和监控。高质量的数据能够提升业务决策的准确性,优化业务流程,并挖掘潜在的商业价值。随着大数据和人工智能技术的发展,数据质量管理在确保数据准确性和可靠性方面的作用愈发重要。企业需要建立完善的数据质量管理和校验机制,并通过数据清洗和标准化提高数据质量。 数据安全与隐私保护是数据治理中的另一个重要领域。随着数据量的快速增长和互联网技术的迅速发展,数据安全与隐私保护面临前所未有的挑战。企业需要加强数据安全与隐私保护的法律法规和技术手段,采用数据加密、脱敏和备份恢复等技术手段,以及加强培训和教育,提高安全意识和技能水平。 数据流程管理与监控是确保数据质量、提高数据利用率、保护数据安全的重要环节。有效的数据流程管理可以确保数据流程的合规性和高效性,而实时监控则有助于及时发现并解决潜在问题。企业需要设计合理的数据流程架构,制定详细的数据管理流程规范,并运用数据审计和可视化技术手段进行监控。 数据资产管理是将数据视为组织的重要资产,通过有效的管理和利用,为组织带来经济价值。数据资产管理涵盖数据的整个生命周期,包括数据的创建、存储、处理、共享、使用和保护。它面临的挑战包括数据量的快速增长、数据类型的多样化和数据更新的迅速性。组织需要建立完善的数据管理体系,提高数据处理和分析能力,以应对这些挑战。同时,数据资产的分类与评估、共享与使用规范也是数据资产管理的重要组成部分,需要制定合理的标准和规范,确保数据共享的安全性和隐私保护,以及建立合理的利益分配和权益保障机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值