先抛出一个问题,看下面代码:
LGPerson *p = [LGPerson alloc];LGPerson *p1 = [p init];LGPerson *p2 = [p init];复制代码
上面三个对象的指针分布情况?
运行结果:
可以发现,这三个对象的地址是一样的,为什么呢?这里就引起思考,上面的alloc
和init
到底做了什么?下面我们通过分析一下。
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
流程图