天天看點

alloc初探

一、使用alloc

首先建立一個demo,通過列印alloc、init生成對象的位址

alloc初探

兩次alloc可以看出每次alloc會分别開辟一塊記憶體功能,而三次init沒有開辟記憶體的功能,但會有三個不同的指針指向同一塊記憶體。

根據控制台輸出的位址可以發現

對象存在棧區 高->低

指針存在堆區 低->高

ps:棧區記憶體是高位址到低位址,堆區記憶體是低位址到高位址。

二、調試方法 三種

首先來個斷點(和上面圖在同一個位置),運作

①符号斷點

按住control 點選step into (那個向下的箭頭 不按住的時候下面方塊是長方形的)

alloc初探
alloc初探

啊哈,進入了objc_alloc方法

②檢視彙編

斷住之後,直接進入彙編代碼

alloc初探
alloc初探

③根據方法名添加斷點

alloc初探

總結:

三種方式執行之後發現執行順序是:

alloc->alloc_objc->callAlloc

有點鬧不明白哈

三、找到源碼去看一下

opensource

偷懶github位址

然後在找到main.m 添加一下alloc方法,再來一個斷點,運作 ,兩次step into

alloc初探

點選step into

alloc初探

這裡分為有緩存和無緩存兩種情況

(1)當有緩存時:通過 _objc_rootAllocWithZone -> _class_createInstanceFromZone -> instanceSize -> calloc -> initInstanceIsa

(2)無緩存時:callAlloc内部通過objc_msgSend 調用alloc方法, 在alloc方法内部執行 _objc_rootAlloc -> callAlloc -> _objc_rootAllocWithZone -> _class_createInstanceFromZone -> instanceSize -> calloc -> initInstanceIsa

嗯,先抄到這裡

繼續閱讀