iOS- load和initialize 子類,分類,父類,以及同名方法的調用順序

環境介紹

編譯文件順序
編譯文件順序
目錄文件(包含父類,子類,分類)
目錄文件

+ (void)load

1.+load方法加載順序:父類> 子類> 分類 (load方法都會加載)
注意:(如果分類中有A,B,順序要看A,B加入工程中順序) ,
可能結果:( 父類> 子類> 分類A> 分類B ) 或者( 父類> 子類> 分類B> 分類A )
2.+load方法不會被覆蓋(比如有父類,子類,分類A,分類B,這四個load方法都會加載)。
3.+load方法調用在main函數前。

+ (void)initialize

+initialize方法加載順序有以下4種情況
(1)分類 (子類沒有initialize方法,父類存在或者沒有initialize方法)
(2)分類> 子類 (多個分類就看編譯順序,只有存在一個)
(3)父類> 子類 (分類沒有initialize方法)
(4)父類 (子類,分類都沒有initialize方法)
總結+initialize:
1.當調用子類的+ initialize方法時候,先調用父類的,如果父類有分類, 那麼分類的+ initialize會覆蓋掉父類的。
2.分類的+ initialize會覆蓋掉父類的
3.子類的+ initialize不會覆蓋分類的
4.父類的+ initialize不一定會調用, 因爲有可能父類的分類重寫了它
5.發生在main函數後。

執行子類方法,看看initialize執行順序:

[[Son new] commonInstanceMethod];

當工程中Person主類有initialize,分類不存在initialize,結果如下:

+[Person initialize]
+[Son initialize]
-[Son commonInstanceMethod]

當工程中Person主類有或無initialize,分類存在initialize,結果如下:

+[Person(A) initialize]
+[Son initialize]
-[Son commonInstanceMethod]

主類和分類有同名方法

主類和分類有同名方法,分類會覆蓋主類的方法。最後只保留一個同名方法。
比如:主類Person和分類Person+A都有commonClsMethod類方法,執行程序結果如下:

+[Person(A) commonClsMethod]

github的demo:
InitializeAndLoadDemo

參考資料:
iOS - 分類中同名方法的調用順序

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章