先抛出一个问题,看下面代码:设计模式
LGPerson *p = [LGPerson alloc];
LGPerson *p1 = [p init];
LGPerson *p2 = [p init];
复制代码
上面三个对象的指针分布状况?bash
运行结果:app
能够发现,这三个对象的地址是同样的,为何呢?这里就引发思考,上面的alloc
和init
到底作了什么?下面咱们经过源码分析一下。源码分析
先看alloc
,以下图spa
_objc_rootAlloc()
里的
self
在这里指的是
LGPerson
,而后走到
_objc_rootAlloc()
方法里
callAlloc()
方法
class_createInstance
方法,以下图
接着进入_class_createInstanceFromZone
方法,能够称之为“干实事”的方法,以下图 设计
instanceSize()
方法分配内存,
calloc()
开辟空间,
initInstanceIsa()
建立对象。
initInstanceIsa()
方法能够发现,建立对象的同时,伴随初始化了
isa
。
进入init
方法 指针
_objc_rootInit
方法
init
方法什么事情都没有作。
思考:为何
init
会什么都不作?code
其实这是一种设计模式,本身思考一下,平常开发过程当中,咱们会在什么状况下,进行init
方法的使用。—— 重写
在重写默认初始化的时候,咱们能够根据本身的需求,进行各类个性化的设置。
工厂设计,父类没有执行,交给子类去实现。cdn
alloc
流程图 对象