美文网首页
从源码的角度看alloc init new

从源码的角度看alloc init new

作者: 改变1 | 来源:发表于2022-12-05 16:56 被阅读0次

    下载了和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

    相关文章

      网友评论

          本文标题:从源码的角度看alloc init new

          本文链接:https://www.haomeiwen.com/subject/lskifdtx.html