OC對(duì)象的底層原理

配置objc源碼

要學(xué)習(xí),先要看底層源碼是怎么回事兒,那就下載源碼,調(diào)試查看。
從蘋(píng)果官方opensource中可以下載到objc開(kāi)源代碼。經(jīng)過(guò)配置,我們能夠?qū)⑦@個(gè)源碼執(zhí)行到工程中去。
具體配置方法如下:
一、


image.png

二、


image.png

三、
image.png

四、
image.png

五、
image.png

六、


image.png

七、
image.png

alloc底層原理

其實(shí)objc內(nèi)部執(zhí)行init方法時(shí)是發(fā)送一個(gè)alloc消息,這個(gè)消息的接受者是class
LGPerson:


image.png

然后,我們可以通過(guò)跟蹤源碼,找到alloc最后是會(huì)執(zhí)行了NSObject alloc方法,通過(guò)查看x1寄存器知道,這個(gè)方法就是alloc方法。


image.png

通過(guò)代碼流程發(fā)現(xiàn),最后創(chuàng)建了這個(gè)對(duì)象,而這個(gè)對(duì)象就是最后返回的對(duì)象了。


image.png

alloc方法整個(gè)創(chuàng)建對(duì)象流程圖:


image.png

總結(jié):其實(shí)alloc這個(gè)類(lèi)方法當(dāng)在調(diào)用的時(shí)候,內(nèi)部已經(jīng)創(chuàng)建了相應(yīng)的實(shí)例對(duì)象,所以這個(gè)對(duì)象已經(jīng)存在了。

既然alloc已經(jīng)創(chuàng)建了對(duì)象,那么init方法干嘛了呢?

init方法底層原理

通過(guò)斷點(diǎn)調(diào)試,同樣發(fā)現(xiàn)這里是通過(guò)發(fā)送消息init執(zhí)行的。
然后查看源碼發(fā)現(xiàn),init方法最后什么都沒(méi)有做,只是將alloc創(chuàng)建的對(duì)象直接返回了而已!


所以這就是init方法最后干的事情,其實(shí)就是什么也沒(méi)有干。
那么為什么蘋(píng)果會(huì)這樣設(shè)計(jì)呢,我們從NSObject的init方法中沒(méi)有找到什么處理,那是因?yàn)樗荖SObject。
還記得我們經(jīng)常初始化一些類(lèi)的時(shí)候,會(huì)重寫(xiě)init方法嗎?
其實(shí)蘋(píng)果留出來(lái)這個(gè)方法就是方便開(kāi)發(fā)者,因?yàn)檫@個(gè)實(shí)例對(duì)象已經(jīng)在alloc時(shí)存了,所以,當(dāng)執(zhí)行init的時(shí)候,可以給這個(gè)對(duì)象復(fù)制,屬性初始化等等這個(gè)操作了,方便程序員在對(duì)象返回之前做一些想要做得事情。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容