alloc流程图

首先,先下载 objc-781源码进行调试,你才知道整个流程的来龙去脉。

然后点进alloc方法里面,得知一系列的方法调用_objc_rootAlloc -> callAlloc->_objc_rootAllocWithZone->_class_createInstanceFromZone。  其中有些代码没有调用,就是所谓的编译器优化,我也是学了才知道还有这么一回事

接下来重点来了:

alloc 创建的三大步骤

第一步:通过  cls->instanceSize 计算出需要开辟多大的内存空间

第二步:进入 calloc 向系统申请开辟内存,返回地址指针

 第三步:最后用 obj->initInstanceIsa  关联相应的类,将类和指针地址绑定在一起,得到最终对象。

接下来讲讲细节:

1.计算开辟多大内存的时候是通过16字节对齐算法算的,其目的就是为了更快速度和防止程序出错,出现野指针等。

2.alloc和new创建对象没啥区别,都是走的callAlloc,但还是推荐用alloc init的方式, 因为创建对象的时候init可以构造方法,这点new是搞不了的

3.对象内存的大小是属性影响的,声明一个8字节的属性是16字节,声明2个8字节的属性就是3个8字节相加,32字节了,不是24字节,因为是16字节对其,只能向上对其,不能往下

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。