alloc 开辟对象的内存
默认alloc 是id类型的对象,通过initISA 将对象和对象的ISA指针关联起来
obj->initISA(cls)
isa 指向的实例对象所指向的类对象 存放了类对象的内存地址 和 与对象相关的信息 比如 引用计数 、弱引用、是否有C++变量,等信息
- nonpoint 1
- has_assoc 1
- has_cxx_dtor 1
- shift_cls 33 (arm64真机) 44(x86_64 intel)52(arm64模拟器)类对象的内存地址位数
- weakly_referenced
- side_table
- extr_rc 19(arm64真机) 54(x86_64 intel)8(x86_64,arm64模拟器)
通过位运算,计算类对象的内存地址
影响对象大小的因素
- 成员变量的值 cls-->instanceSizeof() 计算需要的内存大小
- ISA (固定8字节 2^8 64bit位)
calloc() 系统实际分配的内存方法
苹果自动重排,,不足8字节的合并,遵循内存8字节对齐优化
重排的是对象的属性,不是成员变量
位域 :
struct 和 unit 结构体和联合体的区别
- 结构体里面的对象都有内存,成员变量有个字的内存地址 2、联合题里面的只有一个对象有效,大小(容纳最大的成员变量(基本数据类型)占字节整数倍),里面的属性只是提供了访问联合体的途径,所有属性公用一个内存地址
区别: 变量 结构体里变量共存,联合体变量互斥 大小 联合体省内存,结构体变量都有内存
终端打印
- P 打印 对象类型 + 引用名 + 地址
- po打印的是对象的值
- p/x 16进制
- p/o 8进制
- p/t 2进制
- p/f 浮点类型
x/4gx
- 4 4个八字节
- g 每个八字节
- x 16进制
表示 以16进制形式打印对象的4个八字节内存地址