有時候,類必須執(zhí)行某些初始化操作才能正常使用。OC中的大部分類都繼承自NSObject,它提供了兩個可以執(zhí)行初始化操作的方法。
- (void)load;
被加入運(yùn)行期系統(tǒng)(iOS一般是應(yīng)用啟動時)的類和分類都會調(diào)用這個方法,只調(diào)用一次。先調(diào)用類里的,再調(diào)用分類的。按照分類引入的順序,調(diào)用分類的load方法。
在load方法中調(diào)用別的類是不安全的!因為不知道它們調(diào)用的順序,比如代碼中還依賴別的庫,別的庫的相關(guān)類的load方法也會執(zhí)行,會出現(xiàn)交叉的情況。
注意:load方法不遵從繼承。即:類中沒實現(xiàn)load方法,不管超類是否實現(xiàn)load方法,都不會去執(zhí)行。能精簡盡量精簡。
- (void)initialize;
首次用類的時候會調(diào)用這個類,只調(diào)用一次,惰性調(diào)用。它是由運(yùn)行時系統(tǒng)來調(diào)用的,不能直接調(diào)用。
initialize方法是在線程安全的環(huán)境下調(diào)用,可以操作類或類的實例
initialize方法遵循繼承規(guī)則,如果類中沒實現(xiàn)它,會去調(diào)用超類中的實現(xiàn)。
方法里的代碼要精簡,設(shè)置一些狀態(tài),是類能正常進(jìn)行即可,不要執(zhí)行一些耗時或者需要加鎖的任務(wù)。
initialize方法只應(yīng)該用來設(shè)置內(nèi)部數(shù)據(jù)。不應(yīng)該在其中調(diào)用別的方法,即使是自己的方法也不該調(diào)用。例如:某個全局狀態(tài)在編譯器沒辦法編譯期初始化,就可以放在這里。
比如:單例類在首次調(diào)用之前,必須執(zhí)行某些操作,就可以使用initialize方法。