alloc 探索
alloc 已经创建了对象 init
alloc 实现 原理 源码实现
介绍三种方式
1、下断点: (xcode 11下亲测) control + in - objc_alloc
2、下符号断点:libobjc.A.dylib` + [NSObject alloc]:
3、汇编 libobjc.A.dylib`objc_alloc:
可以看出 p1 p2 p3 为同一个对象,但是 &p1 &p2 &p3 是三个不同的指针指向了同一个内存区域,所以是不同的。
libobjc.A.dylib`objc_alloc:
通过汇编查看
部分开源源码地址 https://opensource.apple.com/tarballs/
objc4-750源码下查看, NSObject.mm 文件中,mm支持c++ 混编
创建对象 申请内存空间 - 指针
x0 寄存器是 第一个参数,返回的时候是返回值的存储地方
通过xcode 11.0 调试,在依次打上如下断点的时候,发现一直在 系统内中alloc,所以我在LGPerson中重写的init 方法打了断点,再程序进入LGPerson 的init 方法后再将下面的断点打开,即可找到LGPerson 的alloc 真实断点。
alloc 是否有创建对象的能力 , 流程返回的时候 x0 就会存储一个指针-申请的内存空间
ro 中包含
word_align 方法, 字节对齐
x p 以十六进制打印p对象在内存中地址
x/4xg p 指令,将p 的内存地址以8字节为一段形式读出来,共读取了4段
x/4xw p 指令, 将p 的内存地址以4字节为一段形式读出来,共读取了4段
alloc 做了很多事情,而init 只是返回了self ,这里可以为开发者重写 init 方法提供了便利,因为我们会在对象的初始化的时候做一些自己的事情。
而new 方法就是 callAlloc + init ,就是alloc + init
alloc -> _objc_rootAlloc -> callAlloc -> class_createInstance -> _class_createInstanceFromZone -> calloc -> initInstanceIsa
po 指令,指的是 expression -o
网友评论