从源码的角度看alloc init new

2022-12-05  本文已影响0人  改变1

下载了和alloc相关的苹果开源代码,从里面看下对应的alloc和init还有new的区别。源码和运行项目https://gitee.com/gitzhengjianhua/ocalloc.git
alloc⽅法的底层调⽤流程
alloc-> objc_alloc —> callAlloc —> objc_msgSend —> alloc —> _objc_rootAlloc —> callAlloc —>_objc_rootAllocWithZone —> _class_createInstanceFromZone
_class_createInstanceFromZone是alloc过程中很重要的一个方法,里面包含了计算分配内存空间大小。如果存在属性等数据,此过程中也同步计算了属性的内存和布局。字节对齐等操作也同步进行。

image.png
补充简单记录下为什么要内存对齐
字节是内存的容量单位。但是,CPU在读取内存的时候,却不是以字节为单位来读取的,⽽是以
“块”为单位读取的,所以⼤家也经常听到⼀块内存,“块”的⼤⼩也就是内存存取的⼒度。如果不
对⻬的话,在我们频繁的存取内存的时候,CPU就需要花费⼤量的精⼒去分辨你要读取多少字节,
这就会造成CPU的效率低下,如果想要CPU能够⾼效读取数据,那就需要找⼀个规范,这个规范就
是字节对⻬。
为什么对象内部的成员变量是以8字节对⻬,系统实际分配的内存以16字节对⻬?
以空间换时间。苹果采取16字节对⻬,是因为OC的对象中,第⼀位叫isa指针,它是必然存在的,
⽽且它就占了8位字节,就算对象中没有其他的属性了,也⼀定有⼀个isa,那对象就⾄少要占⽤8
位字节。如果以8位字节对⻬的话,如果连续的两块内存都是没有属性的对象,那么它们的内存空
间就会完全的挨在⼀起,是容易混乱的。以16字节为⼀块,这就保证了CPU在读取的时候,按照块
读取就可以,效率更⾼,同时还不容易混乱
init方法
从源码看,其实啥也没干,直接返回了自己。init的存在更多的是为了工厂设计和重写使用。我们经常会重写init方法在初始化完成后做一些其他事情,比如更新ui等
image.png
new方法
new方法实际上是直接调用callAlloc+init,可以理解为是alloc和init的结合体。
image.png
上一篇下一篇

猜你喜欢

热点阅读