load方法:
在類對象一被加載到進程的地址空間內,runtime就會向每個類對象發送load消息。對于程序可執行文件中的那些類而言,runtime在進程生命周期非常早的時候就會向其發送load消息。對于那些共享的動態加載的類庫中的類,runtime在共享的類庫一被加載到進程地址空間中,便向其發送load消息。
1)一個類若不實現load方法,便不會被調用。
2)若一個類沒有實現load方法就不會調用,但若其父類實現了load方法,就會調用其父類的load方法。runtime會在向該類所有的父類對象(父類對象實現了load方法)和你鏈接的共享類庫中所有的類對象發送load消息之后,向該類的類對象發送load消息,但是你并不會知道哪些類收到了load消息
3)category的load方法也會被調用,即使幾個category實現了同一個類的load方法。這是屬于特例,因為在通常情況下,若兩個category定義了同一個類的同一個方法,那么其中的一個方法會被調用,而另一個方法將永遠不會調用。category的load調用發生在主類的load調用之后。對于category而言,load消息是被單獨發送的,這是同一個累的每個category都有各自的load方法的原因。
initialize方法:
runtime會在向類對象或類的實例對象發送第一條消息之前(除了load或initialize)調用類對象的initialize方法。initialize消息是以常用的機制被發送的,因此,若你的類中沒有實現initialize方法,但被繼承的父類實現了,那么會調用父類的initialize方法。若該類的父類還未被發送initialize消息,那么runtime會先向所有的這些父類發送initialize消息。initialize的運行過程是線程安全的。
比較:
load方法對于加入運行時系統中的每個類及分類來說,必定會調用此方法,而且僅調用一次。當包含類或分類的程序載入系統中,就會執行此方法,而這通常指應用程序啟動時。load方法問題在于執行該方法時,系統處于“脆弱狀態”,若代碼還依賴其他程序庫,那么程序庫內相關類的load方法也必定會先執行。然而,根據某個給定的程序庫,卻無法判斷出其中各個類的載入順序。因此,在load方法中使用其他類是不安全的。此外,load方法若某個類沒實現,那不管其父類是否實現,均不會被調用。而initialize方法由運行時系統調用,絕不應通過代碼直接調用。它與load區別在于一是“惰性調用”,二是安全調用,即保證線程安全,三是若類未實現,則調用其父類的方法 。