配置objc源碼
要學(xué)習(xí),先要看底層源碼是怎么回事兒,那就下載源碼,調(diào)試查看。
從蘋(píng)果官方opensource中可以下載到objc開(kāi)源代碼。經(jīng)過(guò)配置,我們能夠?qū)⑦@個(gè)源碼執(zhí)行到工程中去。
具體配置方法如下:
一、
二、
三、
四、
五、
六、
七、
alloc底層原理
其實(shí)objc內(nèi)部執(zhí)行init方法時(shí)是發(fā)送一個(gè)alloc消息,這個(gè)消息的接受者是class
LGPerson:
然后,我們可以通過(guò)跟蹤源碼,找到alloc最后是會(huì)執(zhí)行了NSObject alloc方法,通過(guò)查看x1寄存器知道,這個(gè)方法就是alloc方法。
通過(guò)代碼流程發(fā)現(xiàn),最后創(chuàng)建了這個(gè)對(duì)象,而這個(gè)對(duì)象就是最后返回的對(duì)象了。
alloc方法整個(gè)創(chuàng)建對(duì)象流程圖:
總結(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ì)象返回之前做一些想要做得事情。