曾經(jīng)面試過一個大牛,從金山出來典尾,到京東金融役拴。簡歷送到我面前的時候,感覺他就是夜空中最亮的星钾埂。在面試過程中河闰,記憶猶新的就是問了一個關(guān)于 object-c對象,alloc init 的原理以及和new 的區(qū)別褥紫。我記得很清楚他的回答:alloc init 和new 最后都是malloc 實(shí)現(xiàn)的姜性。對于這一回答我抱著謹(jǐn)慎的科學(xué)的態(tài)度告訴他,這個我沒有驗(yàn)證過髓考,你也可以下來可以通過LLDB部念、匯編分析、以及從蘋果官網(wǎng)下載libObjc.dylib氨菇,下載源碼儡炼,分析一下對象初始化流程。
當(dāng)然查蓉,接下來我也去驗(yàn)證了這個問題乌询,首先我去下載了libobjc的源碼、https://opensource.apple.com/release/macos-1014.html豌研。
下載下來解壓后妹田,build會有error、缺失頭文件鹃共,以及編譯選項(xiàng)的配置鬼佣,參考:http://www.reibang.com/p/28150fa0c085。
如果我們在自己的工程中 command + 點(diǎn)擊 alloc及汉,我們回跳到這樣一個頁面沮趣,
這是系統(tǒng)sdk的頭文件,點(diǎn)擊方法沒法跳進(jìn)去坷随,我們只看到表象房铭,而得不到我們想要探究的實(shí)質(zhì)。但是我們有了objc的源碼温眉,情況就不一樣了缸匪,我們可以跟蹤進(jìn)去看個究竟。這就是人類強(qiáng)大好奇心的驅(qū)使类溢,做技術(shù)要常懷好奇心凌蔬、激發(fā)好奇心露懒,這是一種能力。
從這里開始有兩個分支砂心,一個是初始化isa懈词,一個是創(chuàng)建一個實(shí)例createInstance。
再往里面跟蹤辩诞,我們回總結(jié)出來一個這樣一個alloc的內(nèi)部實(shí)現(xiàn)流程坎弯。
接下來,我們再看看init的實(shí)現(xiàn)译暂、
_objc_rootInit 竟然直接返回了 obj抠忘,里面什么也沒有做。那init還拿來干嘛呢外永,這是抽象工廠設(shè)計模式崎脉。
我們自定義一個對象,定義他的屬性伯顶,在它初始化的時候囚灼,它就有一些默認(rèn)值,比如砾淌,占位圖啦撮、占位字符谭网,我們需要重寫init方法汪厨,在它的初始化方法中,給這些屬性賦值愉择。這就是init的作用劫乱!