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

先抛出一个问题,看下面代码:设计模式

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

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

运行结果:app

能够发现,这三个对象的地址是同样的,为何呢?这里就引发思考,上面的allocinit到底作了什么?下面咱们经过源码分析一下。源码分析

alloc源码分析

先看alloc,以下图spa

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

经过断点的方式,能够看到该方法的走向,进入 class_createInstance方法,以下图

接着进入_class_createInstanceFromZone方法,能够称之为“干实事”的方法,以下图 设计

经过 instanceSize()方法分配内存, calloc()开辟空间, initInstanceIsa()建立对象。
而且进入 initInstanceIsa()方法能够发现,建立对象的同时,伴随初始化了 isa

init源码分析

进入init方法 指针

进入 _objc_rootInit方法
能够看到,其实 init方法什么事情都没有作。

思考:为何init会什么都不作?code

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

alloc流程图 对象

相关文章
相关标签/搜索