對(duì)于OC中的類來說喜颁,在runtime中會(huì)有兩個(gè)方法被調(diào)用:
+load
+initialize
這兩個(gè)方法看起來都是在類初始的時(shí)候調(diào)用的畦幢,但其實(shí)還是有一些異同,從而可以用來做一些行為脊僚。
+load
首先轩端,load方法是一定會(huì)在runtime中被調(diào)用的,只要類被添加到runtime中了烦感,就會(huì)調(diào)用load方法巡社,所以我們可以自己實(shí)現(xiàn)laod方法來在這個(gè)時(shí)候執(zhí)行一些行為。
而且有意思的一點(diǎn)是手趣,load方法不會(huì)覆蓋晌该。也就是說肥荔,如果子類實(shí)現(xiàn)了load方法,那么會(huì)先調(diào)用父類的load方法朝群,然后又去執(zhí)行子類的load方法燕耿。同樣的,如果分類實(shí)現(xiàn)了load方法姜胖,也會(huì)先執(zhí)行主類的load方法誉帅,然后又會(huì)去執(zhí)行分類的load方法。所以父類的load會(huì)執(zhí)行很多次右莱,這一點(diǎn)需要注意蚜锨。而且執(zhí)行順序是 類 -> 子類 ->分類。而不同類之間的順序不一定慢蜓。
+initialize
與load不同的是亚再,initialize方法不一定會(huì)執(zhí)行。只有當(dāng)一個(gè)類第一次被發(fā)送消息的時(shí)候會(huì)執(zhí)行晨抡,注意是第一次氛悬。什么叫發(fā)送消息呢,就是執(zhí)行類的一些方法的時(shí)候凄诞。也就是說這個(gè)方法是懶加載,沒有用到這個(gè)類就不會(huì)調(diào)用忍级,可以節(jié)省系統(tǒng)資源帆谍。
還有一點(diǎn)截然相反,卻更符合我們預(yù)期的就是轴咱,initialize方法會(huì)覆蓋汛蝙。也就是說如果子類實(shí)現(xiàn)了initialize方法,就不會(huì)執(zhí)行父類的了朴肺,直接執(zhí)行子類本身的窖剑。如果分類實(shí)現(xiàn)了initialize方法,也不會(huì)再執(zhí)行主類的戈稿。所以initialize方法的執(zhí)行覆蓋順序是 分類 -> 子類 ->類西土。且只會(huì)有一個(gè)initialize方法被執(zhí)行。
感謝作者cloudox_
http://blog.csdn.net/cloudox_