我們?cè)谌粘i_發(fā)中都知道alloc的功能是給對(duì)象來分配內(nèi)存的告材,但是具體底層怎么實(shí)現(xiàn)很少有人去探究,接下來我們通過源碼加匯編的結(jié)合來分析alloc的底層實(shí)現(xiàn)通贞。
在學(xué)習(xí)alloc之前要知道一下runtime是什么搞监,runtime的字面意思是運(yùn)行時(shí),runtime具體是指由C满葛、C++径簿、匯編實(shí)現(xiàn)的一套API,從OC到C語(yǔ)言的過渡增加了運(yùn)行時(shí)功能嘀韧。
一篇亭、給alloc添加斷點(diǎn)調(diào)試:
首先以一個(gè)Person的類為例來講:
Person *obj = [Person alloc];
調(diào)用alloc方法,實(shí)際上是runtime使用objc_msgSend進(jìn)行消息轉(zhuǎn)發(fā)來實(shí)現(xiàn)的方法锄贷,接下來來給alloc加上一個(gè)全局?jǐn)帱c(diǎn):
二译蒂、一步步分析objc源碼
運(yùn)行應(yīng)用斷點(diǎn)會(huì)來到alloc的匯編分析:
從這兩行匯編代碼中可以看出來曼月,alloc實(shí)際上調(diào)用的是libobjc里的_objc_rootAlloc方法,接下來查看官方objc源碼(蘋果官網(wǎng)opensource里下載)來找到這個(gè)方法.
從alloc源碼方法里可以看到跟在匯編里調(diào)用的方法都是_objc_rootAlloc柔昼,接下來再進(jìn)去_objc_rootAlloc方法看:
由上可以看到_objc_rootAlloc方法的返回值有個(gè)callAlloc,繼續(xù)點(diǎn)進(jìn)去會(huì)進(jìn)去callAlloc方法哑芹,接下來會(huì)走:
三、最終實(shí)現(xiàn)
此時(shí)的obj這個(gè)返回值已經(jīng)是我們需要的實(shí)例對(duì)象了捕透,它是通過class_createInstance方法來實(shí)現(xiàn)聪姿,class_createInstance最終會(huì)調(diào)用initIsa來創(chuàng)建實(shí)例對(duì)象并返回;
最終alloc的作用是通過類來創(chuàng)建實(shí)例對(duì)象乙嘀。