我們?cè)谌粘i_(kāi)發(fā)中都知道alloc的功能是給對(duì)象來(lái)分配內(nèi)存的,但是具體底層怎么實(shí)現(xiàn)很少有人去探究,接下來(lái)我們通過(guò)源碼加匯編的結(jié)合來(lái)分析alloc的底層實(shí)現(xiàn)。
在學(xué)習(xí)alloc之前要知道一下runtime是什么,runtime的字面意思是運(yùn)行時(shí),runtime具體是指由C、C++、匯編實(shí)現(xiàn)的一套API,從OC到C語(yǔ)言的過(guò)渡增加了運(yùn)行時(shí)功能。
一、給alloc添加斷點(diǎn)調(diào)試:
首先以一個(gè)Person的類為例來(lái)講:
Person *obj = [Person alloc];
調(diào)用alloc方法,實(shí)際上是runtime使用objc_msgSend進(jìn)行消息轉(zhuǎn)發(fā)來(lái)實(shí)現(xiàn)的方法,接下來(lái)來(lái)給alloc加上一個(gè)全局?jǐn)帱c(diǎn):

二、一步步分析objc源碼
運(yùn)行應(yīng)用斷點(diǎn)會(huì)來(lái)到alloc的匯編分析:

從這兩行匯編代碼中可以看出來(lái),alloc實(shí)際上調(diào)用的是libobjc里的_objc_rootAlloc方法,接下來(lái)查看官方objc源碼(蘋(píng)果官網(wǎng)opensource里下載)來(lái)找到這個(gè)方法.

從alloc源碼方法里可以看到跟在匯編里調(diào)用的方法都是_objc_rootAlloc,接下來(lái)再進(jìn)去_objc_rootAlloc方法看:

由上可以看到_objc_rootAlloc方法的返回值有個(gè)callAlloc,繼續(xù)點(diǎn)進(jìn)去會(huì)進(jìn)去callAlloc方法,接下來(lái)會(huì)走:


三、最終實(shí)現(xiàn)
此時(shí)的obj這個(gè)返回值已經(jīng)是我們需要的實(shí)例對(duì)象了,它是通過(guò)class_createInstance方法來(lái)實(shí)現(xiàn),class_createInstance最終會(huì)調(diào)用initIsa來(lái)創(chuàng)建實(shí)例對(duì)象并返回;

最終alloc的作用是通過(guò)類來(lái)創(chuàng)建實(shí)例對(duì)象。