+load
和+initialize
是兩個與類的載入和初始化相關的特殊方法。它們在類的生命週期中的作用和呼叫時機有明顯的區別。
+load
方法
- 呼叫時機:
+load
在類初始載入進記憶體時呼叫,這通常發生在程式啟動的時候,所有類和分類(Category)的+load
方法在應用程式的生命週期中只會被呼叫一次。 - 呼叫順序:首先呼叫類的
+load
方法,然後呼叫分類的+load
方法。如果有多個分類都實現了+load
方法,它們的呼叫順序是不確定的。 - 繼承性:
+load
方法不會被自動繼承,即使子類沒有實現+load
方法,父類的+load
方法也會被呼叫。如果子類實現了+load
方法,那麼父類和子類的+load
方法都會被呼叫。 - 執行緒安全:
+load
方法是執行緒安全的,Objective-C執行時保證+load
方法在多執行緒環境下安全執行。 - 使用場景:
+load
通常用於設定全域性狀態、註冊類、交換方法實現(Method Swizzling)等,不建議在+load
中進行耗時操作,因為它會影響應用啟動時間。
+initialize
方法
- 呼叫時機:
+initialize
在類或其子類的第一個方法被呼叫之前呼叫,它是懶載入的,只有在類實際被使用時才會被呼叫。 - 呼叫順序:如果子類沒有實現
+initialize
方法,那麼在子類的第一個方法被呼叫之前,父類的+initialize
方法會被呼叫。如果子類實現了+initialize
方法,那麼父類的方法不會被呼叫,除非子類的+initialize
方法中顯式呼叫了[super initialize]
。 - 繼承性:
+initialize
方法會被自動繼承,如果子類沒有提供+initialize
的實現,那麼會呼叫父類的實現。 - 執行緒安全:
+initialize
方法也是執行緒安全的,Objective-C執行時保證+initialize
方法在多執行緒環境下安全執行,並且在每個類中只會被呼叫一次。 - 使用場景:
+initialize
適合用於執行類的懶初始化,如初始化全域性變數、修改靜態資料結構等。
注意事項
- 避免在
+load
和+initialize
中編寫複雜或耗時的初始化程式碼,這可能會影響應用的啟動效能。 +load
和+initialize
都不應該依賴於其他類的初始化程式碼,因為無法保證其他類的初始化順序。- 如果在
+initialize
中使用了多執行緒,要特別注意執行緒安全和死鎖問題,儘管+initialize
本身是執行緒安全的。 - 在
+initialize
中訪問靜態變數時,如果這些變數在其他地方被修改,需要注意同步問題。
其他
既然說這兩個是特殊方法,那麼有哪些非特殊的方法呢:
- 例項方法
-init: 例項的初始化方法,通常在建立物件後手動呼叫或在構造器中呼叫。
-dealloc: 例項被釋放時呼叫的方法,用於執行清理工作。
-description: 返回物件描述的字串,通常用於除錯。
以及其他自定義的例項方法,用於執行物件的具體行為。 - 類方法
+new: 類方法,用於建立類的新例項,它會呼叫alloc和init。
+someClassMethod: 自定義的類方法,用於執行與類相關的操作,而不是與特定例項相關的操作。