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

2019-03-29  本文已影响0人  佐_笾

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

LGPerson *p = [LGPerson alloc];
LGPerson *p1 = [p init];
LGPerson *p2 = [p init];

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

运行结果:

image

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

alloc源码分析

先看alloc,如下图

image
_objc_rootAlloc()里的self在这里指的是LGPerson,然后走到_objc_rootAlloc()方法里
image
接着往下面走,进入callAlloc()方法 image
通过断点的方式,可以看到该方法的走向,进入class_createInstance方法,如下图
image

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

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

init源码分析

进入init方法

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

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

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

alloc流程图

image
上一篇 下一篇

猜你喜欢

热点阅读