1.对象原理探究

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

你可能感兴趣的:(1.对象原理探究)