iOS底层总结

296 阅读2分钟

alloc

image.png alloc 及 内存对齐

Init = 工厂方法,无实际意义,方便自定义初始化方法 new = alloc + init

sizeof(A):获得数据类型的大小,obj指针所占的字节大小为8

class_getInstanceSize:计算对象实际占用内存空间大小(一个类(Class)中成员变量ivar的大小)

malloc_size:计算系统实际给一个对象分配的内存空间大小(输入一个指针,指针所指向空间大小)

Q:一个OC对象占用多少内存 A:系统分配16个字节给NSObject对象(通过malloc_size函数获得) 当alloc一个没有任何属性的对象的时候,获得内存大小是16字节(isa占用8个字节,剩余8个字节以备扩充使用) 但NSObject对象内部只使用8个字节的空间(64bit环境下,可以通过class_getInstanceSize函数获得) 电脑系统中32位和64位是指两种不同的操作系统,表示CPU一次能处理的最大位数.

对象内存分布总结: 对象采用16字节对齐方式,系统给对象开辟的空间大小必定是16的倍数 对象所占空间的大小跟对象的属性有关系,对象的属性内存遵循8字节对齐方式,int属性4字节也分配8字节

结构体内存对齐总结: 1,结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补⻬ 2,数据成员对⻬规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组, 结构体等)的整数倍开始

3,数据成员为结构体:当结构体嵌套了结构体时,作为数据成员的结构体的自身长度作为外部结构体的最大成员的内存大小,比如结构体a嵌套结构体b,b中有char、int、double等,则b的自身长度为8

Q:_objc_rootAllocWithZone到底做了什么? _objc_rootAllocWithZone -> _class_createInstanceFromZone 而_class_createInstanceFromZone函数做了三件事 最终将对象创建返回:

  1. 要申请多大内存空间 (instanceSize)
  2. 申请内存,创建对象 (calloc)
  3. 关联绑定创建的对象 (initInstanceIsa)

Q:NSObject 为什么不走alloc NSObject中的alloc 会走到 objc_alloc,其实这部分是由系统级别的消息处理逻辑,所以NSObject的初始化是由系统完成的,因此也不会走到alloc的源码工程中

总结: 自定义对象的执行顺序 objc_alloc -> alloc , 而NSObject只走了objc_alloc