Object-C alloc 方法探索

在OC开发语言中所有的对象是通过alloc方法来创建,那么今天我就从源码里对alloc方法到底做了什么事情,是如何创建出一个对象的,来进行一下探索。

   WHLPerson *p = [WHLPerson alloc];

    p.age = 20;

    WHLPerson *p1 = [p init];

    WHLPerson *p2 = [p init];

    NSLog(@"\np1 = %@\np2 = %@",p1,p2);

    NSLog(@"%d %d",p1.age,p2.age);

打印结果
2022-12-03 16:24:51.953275+0800 WHL-alloc[2621:43568] 
p1 = 
p2 = 
2022-12-03 16:24:51.953415+0800 WHL-alloc[2621:43568] 20 20

通过以上代码打印结果可以看出p1和p2 内存地址是一样的由此可以得出p、p1、p2指向的是同一个对象,init 并不会参与到创建对象的过程,实际创建对象都是alloc来完成的。通过查看汇编指令和源码,我们得出alloc 方法底层都调用了哪些方法以及方法的调用顺序。

打开汇编查看指令

image.png

alloc 源代码

image.png

image.png

alloc 底层源码方法调用流程

我们通过断点跟踪得到如下的调用流程


image.png

init 方法

image.png

我们看到源码里+ (id)init 方法里什么也没做只是返回对象本身,那么既然什么也没做Apple 为什么要这么做呢?这是为了让我们去重写这个方法去做一些初始化操作,Apple Function 库里的类也都从写了init方法,例如我们经常使用NSArray、NSDiction 内部都对init做了重写。

你可能感兴趣的:(Object-C alloc 方法探索)