iOSload和initialize的異同

NO IMAGE

load和initialize經常被提及,但實際編碼中其實使用不多,一個知識即使當時瞭解的再清楚,一直不使用,也會慢慢忘記,就好像我現在想不起來高中物理的很多公式一樣。

說起這些總要說起原理,其實原理是什麼呢,就是蘋果在runtime的源碼中怎樣去調用這兩個方法的。細節很多,挑出關鍵流程其實也只能是知其然不知其所以然,只能是知道了這麼做,卻不知道為什麼這麼做。優秀的源碼總是經過多次測試多次修改多次優化的。

站在路的終點,我們可能很難想起走在途中的心路歷程。還是需要慢慢摸索,認真沉澱才行。

放個總結,方便回憶。

維度loadinitialize
是否需要調用Super不需要不需要
調用時機類或者category加載到runtime時由系統自動調用 在main函數之前在類或者子類在第一次收到消息時調用(類消息或者實例消息)在main函數之後
調用方式直接通過函數的內存地址調用的,不走msg_send,不走OC消息轉發,每個類的load方法都是獨立的走OC消息轉發, msg_send
調用次數只會調用一次1. 可能會調用多次,如果子類沒有實現該方法,則子類在第一次收到消息時會調用父類的方法。2.如果在子類收到消息前,父類沒有收到過消息,那麼會先調用父類的initialize方法之後再調用子類的initialize方法。
調用順序父類-子類-category 。1.所有的類都加載完之後才會調用所有的category。 2.不同的類的load執行順序跟編譯順序有關,可以在Target -> Build Phases -> Compile Sources 中調整順序。但所有的category都是在所有的類的load都執行完之後,才會調的。 3.多個類的多個category或者一個類的不同category的load方法的順序同樣跟編譯順序有關,可以在compiles source中調整。父類-子類(如果category有實現,會只調用category中的實現;父類的category會覆蓋父類的實現,子類的category會覆蓋子類的category實現)
使用一般用來實現 Method Swizzle一般用來初始化全局變量 或者 靜態變量

相關文章

-Markdown編輯器使用手冊

Handler後傳篇一:為什麼Looper中的Loop()方法不能導致主線程卡死?

Android重修課Handler機制

iOSRunLoop的使用及底層原理