+load方法、+initialize方法

load概述:

1.Category中有load方法
2.load方法在runtime加載類、分類的時候調用
3.load方法可以繼承,但是一般情況下不會主動去調用load方法,都是讓系統自動調用

+load方法

1、+load方法會在runtime加載類、分類是調用
2、每個類、分類的+load,在程序運行過程中只調用一次
3、調用順序:
(1)先調用類的+load
按照編譯先後順序調用(先編譯,先調用)
調用子類的+load之前會先調用父類的+load
(2)再調用分類的+load
按照編譯先後順序調用(先編譯,先調用)

+load 方法是直接從內存中找到這個方法的地址進行直接調用,所以一個類不管有多少分類每一個分類的+load方法都會被調用,不存在找到一個就不再往下找的情況。
其它的類方法一般是通過消息機制進行調用的,凡是通過消息機制進行調用的方法都是通過 isa 進行一層一層查找的,一旦查找到就不會繼續往下查找了。所以一個類的各個分類裏擁有同一個非+load類方法時,調用時根據編譯順序查找到一個就不會繼續往下查找了。

+initialize方法

1、+initialize方法會在類第一次接收到消息時調用
2、調用順序:
先調用父類的+initialize,再調用子類的+initialize
3、+initialize和+load的很大區別是:+initialize是通過objc_msgSend進行調用的,所以有以下特點:
(1)如果子類沒有實現+initialize,會調用父類的+initialize(所以父類的+initialize可能會被調用多次)
(2)如果分類實現了+initialize,就覆蓋類本身的+initialize調用

load、initialize方法的區別是什麼?

1、調用方式
(1)load是根據函數地址直接調用
(2)initialize是通過objc_msgSend調用
2、調用時刻
(1)load是runtime加載類、分類的時候調用(只會調用1次)
(2)initialize是類第一次接收到消息的時候調用,每一個類只會initialize一次(父類的initialize方法可能會被調用多次)
load、initialize的調用順序?
1、load
(1)先調用類的load
a)先編譯的類,優先調用load
b)調用子類的load之前,會先調用父類的load
(2)再調用分類的load
a)先編譯的分類,有限調用load
2、initialize
(1)先初始化父類
(2)再初始化子類(可能最終調用的是父類的initialize方法)

發佈了26 篇原創文章 · 獲贊 16 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章