一、load
load的方法調(diào)用是在加載類的時(shí)候封豪,是通過(guò)函數(shù)的指針直接調(diào)用的谴轮,不是通過(guò)obj_msgSend消息發(fā)送機(jī)制,所以不存在查找的過(guò)程吹埠。
因?yàn)槭峭ㄟ^(guò)函數(shù)指針直接調(diào)動(dòng)第步,所以正常情況下,所有實(shí)現(xiàn)了load方法的類都會(huì)被調(diào)用load方法缘琅。
二粘都、initialize
類第一次接受到消息的時(shí)候調(diào)用。因?yàn)樽叩氖窍C(jī)制(objc_msgSend)刷袍。根據(jù)消息機(jī)制的查找機(jī)制翩隧,先找到的是分類的方法,調(diào)用的是分類的initialize呻纹。正常情況下堆生,每個(gè)類的initialize只會(huì)調(diào)用一次。
下面我們看一種情況:
MJPerson為MJStudent的父類雷酪,MJPerson實(shí)現(xiàn)了initialize方法淑仆,MJStudent未實(shí)現(xiàn)initialize方法。此時(shí)調(diào)用[[MJStudent alloc] init]哥力。會(huì)發(fā)生什么情況蔗怠。
結(jié)果為父類MJPerson的initialize被調(diào)用了兩次。為什么呢省骂?
根據(jù)這個(gè)偽代碼钞澳,答案很明確了怠惶。[[MJStudent alloc] init]的時(shí)候,發(fā)現(xiàn)MJStudent沒(méi)有初始化轧粟,接著發(fā)現(xiàn)MJPerson也沒(méi)初始化策治,會(huì)先去初始化MJPerson,通過(guò)objc_msgSend調(diào)用MJPerson的initialize方法兰吟。接著再調(diào)用自己的initialize方法通惫,因?yàn)镸JStudent沒(méi)有實(shí)現(xiàn)initialize方法,根據(jù)objc_msgSend的機(jī)制混蔼,會(huì)去父類MJPerson找initialize履腋,因?yàn)镸JPerson類實(shí)現(xiàn)了initialize方法,所以就再一次調(diào)用了MJPerson的initialize方法。
三遵湖、總結(jié)
最重要的一點(diǎn):
load是通過(guò)指針直接調(diào)用的悔政,所以可以所有類的load都可以被調(diào)用,其實(shí)load就是要達(dá)到這個(gè)目的延旧。
initialize是通過(guò)objc_msgSend調(diào)用的谋国,根據(jù)objc_msgSend的調(diào)用原理,一個(gè)類(分類)實(shí)現(xiàn)了多個(gè)initialize迁沫,那么只有一個(gè)initialize被調(diào)用芦瘾。