前陣子中在使用Method swizzle 時赫然發現,所有的isntance 都會跑到我的swizzle method 來,而不是只針對有import 該category 的檔案,與我的理解不同。

因此研究了一下 +load 這個class method 究竟什麼時候會被invoke。

這篇文章 當中,描述得非常詳細,+load幾個很重要的特性:

  1. 在你還沒invoke 任何跟該class 的方法之前就已經被invoke
  2. 任何實作+load 方法的class 或category 都會被執行一次
  3. main() 之前就已經invoke

也就是說,method swizzle 只要「寫過」就會無時無刻的發生,儘管你沒有import 該category,因此他會影響整個app 的執行,因此在網路上找method swizzle 的相關資料時,普遍會看到:method swizzle 是危險的,需小心使用

不過在一些狀況下,使用method swizzle 的方式的確會簡化整個程式的寫法,有機會再寫一篇與method swizzle 使用的相關例子。

— 補充於 2016/11/1 —

WWDC 2016 – Session 406 Optimizing App Startup Time 18:54 有提到一些關於Objc runtime 的特性,就可以知道整個運作的life cycle。

當中提到,category 的method 於「Objc」這個階段被加入method lists,於「Initializers」 階段運行 +load method,而影片提到的五個階段都在main() 被invoke 之前,也就是說在app 還沒有launch 時就已經決定。

Refrence

  1. What is the difference between load and initialize method?
  2. Objective-C Class Loading and Initialization