iOS面試題-load 和 initlize的區別

机械心發表於2024-07-22

+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中訪問靜態變數時,如果這些變數在其他地方被修改,需要注意同步問題。

其他

既然說這兩個是特殊方法,那麼有哪些非特殊的方法呢:

  1. 例項方法
    -init: 例項的初始化方法,通常在建立物件後手動呼叫或在構造器中呼叫。
    -dealloc: 例項被釋放時呼叫的方法,用於執行清理工作。
    -description: 返回物件描述的字串,通常用於除錯。
    以及其他自定義的例項方法,用於執行物件的具體行為。
  2. 類方法
    +new: 類方法,用於建立類的新例項,它會呼叫alloc和init。
    +someClassMethod: 自定義的類方法,用於執行與類相關的操作,而不是與特定例項相關的操作。

相關文章