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 = <WHLPerson: 0x6000012486b0>
p2 = <WHLPerson: 0x6000012486b0>
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做了重写。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容