alloc初探
我們運行如下代碼:
通過控制臺伟阔,我們可以看到打印結(jié)果如下:
可以看到打印的是同一個對象鼻疮,不同的只是它們的指針地址(右邊箭頭所示),指向同一塊內(nèi)存0x600002946760(左邊箭頭所示)。說明alloc就是在創(chuàng)建對象了巢墅,哪對象創(chuàng)建的具體過程是怎樣的呢架谎?這時就要查看alloc的源碼實現(xiàn)了炸宵。
選中alloc并點擊Jump to Definition 或者control+command+alloc 然后選中NSObject并跳轉(zhuǎn)進去,發(fā)現(xiàn)只有alloc方法的聲明:
怎么辦呢谷扣?這里教大家一些方法:
1土全、control+Step into
2、通過匯編查看(Debug--->DebugWorkflow--->Always show Disassembly)
這里我們使用第一種方式会涎,如圖所示:
發(fā)現(xiàn)這里調(diào)用的是objc_alloc裹匙,我們添加一個符號斷點看一下:
發(fā)現(xiàn)是libobjc.A.dylib,接下來就要開始探究libobjc
libobjc源碼探索
運行代碼在塔,并添加符號斷點objc_alloc幻件,它會進入objc_alloc,如圖:
接下來會進入callAlloc(第一次)
一步步往下走蛔溃,發(fā)現(xiàn)這里進行了一次objc_msgSend
搜索alloc绰沥,如圖:
進入_objc_rootAlloc,如圖:
又來到了callAlloc這個方法中(第二次)贺待,兩次參數(shù)不同
進入_objc_rootAllocWithZone(cls, nil)徽曲,如圖:
進入_class_createInstancesFromZone,如圖:
這里面都進行了哪些操作呢麸塞?這里我們來看一下:
1秃臣、計算需要開辟的內(nèi)存大小,同時進行了字節(jié)對齊(16字節(jié))
2哪工、根據(jù)計算的大小去申請內(nèi)存
3奥此、將對象與申請的空間進行綁定并返回
下面是流程圖: