美文网首页
alloc开辟空间流程

alloc开辟空间流程

作者: CY水漆 | 来源:发表于2020-09-06 21:02 被阅读0次

项目准备

苹果开源源码汇总: https://opensource.apple.com
这个地址⽤的更直接 https://opensource.apple.com/tarballs/
到这里下载objc的源码进行解析

开始:
首先来看一组打印
例如,一下情况打印的内存地址输出是一样

说明alloc开辟了内存空间,init并没有开辟内存空间

alloc又是怎么开辟内存的呢?继续往下
首先来看一张图开辟空间执行顺序

通过源码我们一步一步往里面走
1.alloc调用了_objc_rootAlloc

2._objc_rootAlloc方法中调用了callAlloc方法,但是由于编译器的优化,callAlloc并没有走

3.callAlloc调用_objc_rootAllocWithZone

4_objc_rootAllocWithZone调用_class_createInstanceFromZone
1).cls->instanceSize计算开辟内存空间的大小
点进去方法发现得到的内存是16

系统在开辟内存的时候是内存对齐的,都是16的倍数,为了更快和安全
每个对象分配出来都会包含一个isa,isa就会占8个字节,如果只是分配8个字节的话,每一个创建出来的对象都会紧挨着前一个对象,所以很容易出现野指针,访问内存错误等问题,而16字节是留出来了预留字节,这样每次访问的时候会相对于更加安全

2).calloc  向系统申请内存,返回地址指针

图上方法走之前,obj是nil,但是当方法走了以后,会返回一个地址指针,但是这个地址指针并没有关联到我们的类上面
3).obj->initInstanceIsa关联到对象

上图方法走之前打印obj可以看到只是一个地址,并没有输出我们的类

但是当走了obj->initInstanceIsa方法以后,我们再次打印发现

此时我们的类名已经关联到了指针上面

然后返回我们的对象


相关文章

  • alloc开辟空间流程

    项目准备苹果开源源码汇总: https://opensource.apple.com这个地址⽤的更直接 https...

  • alloc流程图

    问题:alloc 做了什么init做了什么new 做了什么alloc 是怎么开辟内存空间的 调用alloc流程图 ...

  • 01-OC对象的本质

    探究:1.objc_alloc流程2.init操作3.开辟内存 alloc开辟内存. objc_alloc流程1....

  • iOS alloc init new

    alloc :开辟内存空间,初始化实例init: 默认的构建函数重载new :相当于[[Class alloc] ...

  • iOS alloc和init的原理

    整体来看,alloc是用来开辟空间并关联类,init则是返回这片空间的首地址

  • iOS Objective-C底层 part4:die

    生对死,alloc对dealloc alloc经历了一些周折才调用calloc,开辟内存空间.dealloc也一样...

  • OC底层原理05 - isa与对象的关联

    对象在alloc的时候有重要三步。 计算需要开辟的内存空间大小 开辟指定大小的空间 将对象与isa指针关联起来 本...

  • OC底层_alloc分析

    alloc 做了什么 ? 开辟了 内存空间 , 栈内存是连续的, 内存相差 8字节 怎么开辟的呢? init 做了...

  • Ios面试复习--对象初始化

    1.alloc init new 1.alloc --1.开辟存储空间 --2.将所有的属性设置为0 --3.返回...

  • 001-OC对象原理探究

    alloc探索 通过这篇文章可以知道什么: alloc方法是如何开辟内存的,开辟了多少内存? 在alloc过程中内...

网友评论

      本文标题:alloc开辟空间流程

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