笔记-从源码角度分析alloc与init的底层

本文深入解析Objective-C中alloc与init方法的工作原理,通过源码分析揭示LGPerson对象指针相同的原因,探讨init方法的设计模式及在重写场景中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先抛出一个问题,看下面代码:

LGPerson *p = [LGPerson alloc];
LGPerson *p1 = [p init];
LGPerson *p2 = [p init];
复制代码

上面三个对象的指针分布情况?

运行结果:

可以发现,这三个对象的地址是一样的,为什么呢?这里就引起思考,上面的allocinit到底做了什么?下面我们通过源码分析一下。

alloc源码分析

先看alloc,如下图

_objc_rootAlloc()里的 self在这里指的是 LGPerson,然后走到 _objc_rootAlloc()方法里
接着往下面走,进入 callAlloc()方法

通过断点的方式,可以看到该方法的走向,进入 class_createInstance方法,如下图

接着进入_class_createInstanceFromZone方法,可以称之为“干实事”的方法,如下图

通过 instanceSize()方法分配内存, calloc()开辟空间, initInstanceIsa()创建对象。
并且进入 initInstanceIsa()方法可以发现,创建对象的同时,伴随初始化了 isa

init源码分析

进入init方法

进入 _objc_rootInit方法
可以看到,其实 init方法什么事情都没有做。

思考:为什么init会什么都不做?

其实这是一种设计模式,自己思考一下,日常开发过程中,我们会在什么情况下,进行init方法的使用。—— 重写
在重写默认初始化的时候,我们可以根据自己的需求,进行各种个性化的设置。
工厂设计,父类没有执行,交给子类去实现。

alloc流程图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值