問:NSObject的load和initialize方法许帐?
答:load和initialize的共同特點
在不考慮開發(fā)者主動使用的情況下批销,系統(tǒng)最多會調(diào)用一次
如果父類和子類都被調(diào)用,父類的調(diào)用一定在子類之前
都是為了應(yīng)用運行提前創(chuàng)建合適的運行環(huán)境
在使用時都不要過重地依賴于這兩個方法匪煌,除非真正必要
load和initialize的區(qū)別
load方法
調(diào)用時機比較早锤灿,運行環(huán)境有不確定因素。具體說來应民,在iOS上通常就是App啟動時進行加載,但當load調(diào)用的時候夕吻,并不能保證所有類都加載完成且可用瑞妇,必要時還要自己負責做auto release處理。對于有依賴關(guān)系的兩個庫中梭冠,被依賴的類的load會優(yōu)先調(diào)用。但在一個庫之內(nèi)改备,調(diào)用順序是不確定的控漠。
對于一個類而言,沒有l(wèi)oad方法實現(xiàn)就不會調(diào)用悬钳,不會考慮對NSObject的繼承盐捷。
一個類的load方法不用寫明[super load],父類就會收到調(diào)用默勾,并且在子類之前碉渡。
Category的load也會收到調(diào)用,但順序上在主類的load調(diào)用之后母剥。
不會直接觸發(fā)initialize的調(diào)用滞诺。
initialize方法相關(guān)要點
initialize的自然調(diào)用是在第一次主動使用當前類的時候形导。
在initialize方法收到調(diào)用時,運行環(huán)境基本健全习霹。
initialize的運行過程中是能保證線程安全的朵耕。
和load不同,即使子類不實現(xiàn)initialize方法淋叶,會把父類的實現(xiàn)繼承過來調(diào)用一遍阎曹。注意的是在此之前,父類的方法已經(jīng)被執(zhí)行過一次了煞檩,同樣不需要super調(diào)用处嫌。
由于initialize的這些特點,使得其應(yīng)用比load要略微廣泛一些斟湃⊙#可用來做一些初始化工作,或者單例模式的一種實現(xiàn)方案桐早。?