筆記-從源碼角度分析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流程圖 對象

相關文章
相關標籤/搜索