先拋出一個問題,看下面代碼:設計模式
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
流程圖 對象