一、使用alloc
首先建立一個demo,通過列印alloc、init生成對象的位址
兩次alloc可以看出每次alloc會分别開辟一塊記憶體功能,而三次init沒有開辟記憶體的功能,但會有三個不同的指針指向同一塊記憶體。
根據控制台輸出的位址可以發現
對象存在棧區 高->低
指針存在堆區 低->高
ps:棧區記憶體是高位址到低位址,堆區記憶體是低位址到高位址。
二、調試方法 三種
首先來個斷點(和上面圖在同一個位置),運作
①符号斷點
按住control 點選step into (那個向下的箭頭 不按住的時候下面方塊是長方形的)
啊哈,進入了objc_alloc方法
②檢視彙編
斷住之後,直接進入彙編代碼
③根據方法名添加斷點
總結:
三種方式執行之後發現執行順序是:
alloc->alloc_objc->callAlloc
有點鬧不明白哈
三、找到源碼去看一下
opensource
偷懶github位址
然後在找到main.m 添加一下alloc方法,再來一個斷點,運作 ,兩次step into
點選step into
這裡分為有緩存和無緩存兩種情況
(1)當有緩存時:通過 _objc_rootAllocWithZone -> _class_createInstanceFromZone -> instanceSize -> calloc -> initInstanceIsa
(2)無緩存時:callAlloc内部通過objc_msgSend 調用alloc方法, 在alloc方法内部執行 _objc_rootAlloc -> callAlloc -> _objc_rootAllocWithZone -> _class_createInstanceFromZone -> instanceSize -> calloc -> initInstanceIsa
嗯,先抄到這裡