ios中,類需要執行初始化操作才能正常使用。繼承於nsobject的類有兩種實現初始化類的方法:load initialize方法。
+ (void)load{}
對於加入執行期的類或分類來說,如果該類實現了load方法,必定會呼叫此方法,且只呼叫一次。當包含類或分類的程式載入系統時,會執行該方法,一般都是程式啟動的時候。如果分類和類中都定義了load方法,先呼叫類中的load,再呼叫分類中的。
也就是說load方法的呼叫是在main函式之前的.我們可以利用這點,將一些類或者配置檔案的註冊寫在load方法中.在main函式之前會做三件事情:
1.動態庫鏈結;
2.imageloader載入可執行檔案(即二進位制檔案);
3.runtime與+load;
load方法的問題在於:執行該方法時,執行期系統處於「脆弱狀態」。在執行子類的load方法之前,必定會執行所有超類的load方法,如果程式還依賴了其他程式庫,程式庫中相關的類的load方法也會執行,而且是先執行。問題在於:根據給定的程式庫,無法判斷各個類的載入順序,比如在某各類中引入了乙個其他類,在該類的load方法要建立其他類的乙個例項,但是無法確定在執行該類的load方法之前,其他類是不是已經載入好了。也許在其他類中的load方法中執行了某些重要操作,執行執行完之後,該例項才能使用。
load
方法不遵守繼承規則,如果某個類中本身沒有實現
load
方法,即使各級超類中實現
load
方法,系統都不會呼叫。
還有乙個問題:load方法務必精簡一些,儘量減少執行的操作。因為整個應用在執行load方法時都會阻塞。凡是想通過load在類載入之前做一些操作的都不對。load方法的真正用途在於除錯程式。判斷類或分類是否正確載入到系統。
+ (void)initialize{}
如果想執行與類相關的初始化操作,可以覆寫initialize方法。該方法也是在程式首次用該類的時候呼叫且呼叫一次。它是由執行期系統呼叫的,絕不可以通過**直接呼叫。
load和initialize區別:
1.initialize方法是「惰性呼叫的」,只有程式使用的時候才呼叫,如果乙個類一直沒有使用過,也就不會呼叫initialize方法。也就是說應用程式無需把每個類中的initialize都執行一遍。
2.執行期執行initialize方法時,是處於正常狀態的。在initialize方法可以安全使用並呼叫任意類的任意方法。
3.initialize方法遵循繼承原則,如果某個類沒有實現它,但其超類實現了,那麼就會執行超類的initialize方法。加入乙個類沒有實現initialize方法,其有乙個父類實現了該方法,那麼在呼叫子類時,會同時呼叫兩次父類initialize方法的。因為子類沒有覆蓋父類的initialize的實現,因此還要把父類的實現在執行一遍。所以通常在initialize中判斷當前要初始化的是哪個類。
4.如果全域性狀態無法在編譯器初始化,可以放在initialize中實現。例如可變陣列,不能再編譯器初始化,因為建立例項之前必須先啟用執行期系統。這種就可以在initialize方法中初始化。
但是initialize方法和load方法都盡量要精簡。因為如果**很複雜,其中可能會直接或間接的引用到其他類,若那些類尚未初始化,則系統會迫使其初始化。然而,本類的初始化此時尚未執行完畢。其他類在執行initialize方法時,有可能會依賴本類中的資料,引入「依賴環」。
Hibernate中get和Load比較
load支援延遲載入.它認為該資料是一定存在的,所以會使用 進行延遲載入.若資料不存在,只能拋異常.get方法,不支援延遲載入.若資料不存在就直接返回null.load方法拋異常是指在使用該物件的資料時,資料庫中不存在該資料時拋異常,而不是在建立這個物件時。在load時會先去查一下session快取...
iOS 的initialize和load方法
initialize和 load這兩個方法在類使用時會自動呼叫。但是兩個方法的不同點會導致應用層面上效能的顯著差異。1.initialize方法 這個方法會在第一次初始化這個類之前被呼叫,我們一般用來初始化靜態變數。initialize方法類似乙個懶載入,如果沒有使用這個類,那麼系統預設不會去呼叫這...
iOS認識load方法
意識到load方法是因為最近學習method swilzzing時發現與其它的系統方法不同。當時建立了乙個uiviewcontroller的catagory並重寫了load方法。在這篇文章 中指出 load 作為 objective c 中的乙個方法,與其它方法有很大的不同。只是乙個在整個檔案被載入...