底层alloc和init下

200 阅读2分钟

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模拟器)

通过位运算,计算类对象的内存地址

影响对象大小的因素

  1. 成员变量的值 cls-->instanceSizeof() 计算需要的内存大小
  2. ISA (固定8字节 2^8 64bit位)

calloc() 系统实际分配的内存方法

苹果自动重排,,不足8字节的合并,遵循内存8字节对齐优化

重排的是对象的属性,不是成员变量

位域 :

struct 和 unit 结构体和联合体的区别

  1. 结构体里面的对象都有内存,成员变量有个字的内存地址 2、联合题里面的只有一个对象有效,大小(容纳最大的成员变量(基本数据类型)占字节整数倍),里面的属性只是提供了访问联合体的途径,所有属性公用一个内存地址

区别: 变量 结构体里变量共存,联合体变量互斥 大小 联合体省内存,结构体变量都有内存

终端打印

  1. P 打印 对象类型 + 引用名 + 地址
  2. po打印的是对象的值
  • p/x 16进制
  • p/o 8进制
  • p/t 2进制
  • p/f 浮点类型

x/4gx

  1. 4 4个八字节
  2. g 每个八字节
  3. x 16进制

表示 以16进制形式打印对象的4个八字节内存地址