之前一直覺(jué)得很復(fù)雜,今天研究了下,其實(shí)不算復(fù)雜(不要怕麻煩),記住這幾點(diǎn)就夠了:
load
load就是類(lèi)的加載,一個(gè)項(xiàng)目啟動(dòng),項(xiàng)目中的所有的類(lèi)就會(huì)調(diào)用load方法,即每個(gè)類(lèi)都會(huì)調(diào)用自己的load方法,包括分類(lèi),但只會(huì)被調(diào)用一次。這里有一點(diǎn)不明白就是調(diào)用的順序有什么講究(不按添加的時(shí)間順序,也不按字母順序),我先記下來(lái)。
initalize
initalize的調(diào)用則是在該類(lèi)第一次被使用時(shí),會(huì)被調(diào)用,也只會(huì)被調(diào)用一次,那么有哪些情況呢?
- 初始化一個(gè)自己的類(lèi)的對(duì)象(準(zhǔn)確說(shuō),是使用,這里是便于理解);
- 初始化一個(gè)子類(lèi)(準(zhǔn)確說(shuō),是使用,這里是便于理解),而且不管是否調(diào)用
[super init],只要是使用;
但是要注意,如果該類(lèi)有分類(lèi),并且在分類(lèi)中重寫(xiě)了initalize方法,那么就只會(huì)調(diào)用分類(lèi)中的initalize方法了。
具體Demo如下圖,首先,文件結(jié)構(gòu)如圖:

Son1繼承自Father類(lèi),Other繼承NSObject,整個(gè)工程,我僅初始化Son1和Other,一共創(chuàng)建3個(gè)對(duì)象。

控制臺(tái)輸出結(jié)果如下:

可以看到,工程中所有的類(lèi)都調(diào)用了load方法,比如沒(méi)有被使用的AAA和SSS類(lèi),我在Son1和Father兩個(gè)類(lèi)以及這兩個(gè)類(lèi)的分類(lèi)都重寫(xiě)了load方法,都在類(lèi)的加載時(shí)被調(diào)用了,當(dāng)初始化一個(gè)Son1對(duì)象時(shí),因?yàn)?code>Son1繼承自Father類(lèi),所以使用到了Father類(lèi),Father類(lèi)的initalize方法就先被調(diào)用了,然后再是Son1的initalize方法被調(diào)用,但是我在Son1的分類(lèi),也就是Son1+Extension.m這個(gè)文件中又重寫(xiě)了initalize方法,因此分類(lèi)的優(yōu)先級(jí)更高,只調(diào)用了Son1的分類(lèi)的initalize方法。Other類(lèi)使用了兩次,但Other類(lèi)的initalize方法僅被調(diào)用一次。最后,因?yàn)轫?xiàng)目沒(méi)有使用AAA和SSS兩個(gè)類(lèi),因此這兩個(gè)類(lèi)的initalize方法沒(méi)有被調(diào)用。