首先,先下载 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字节对其,只能向上对其,不能往下