對于OC中的類來說几缭,在runtime中會有兩個方法被調(diào)用:
- +load
- +initialize
這兩個方法看起來都是在類初始的時候調(diào)用的,但其實還是有一些異同号杠,從而可以用來做一些行為嗜暴。
+load
首先胀莹,load方法是一定會在runtime中被調(diào)用的绰更,只要類被添加到runtime中了瞧挤,就會調(diào)用load方法,所以我們可以自己實現(xiàn)laod方法來在這個時候執(zhí)行一些行為儡湾。
而且有意思的一點是特恬,load方法不會覆蓋。也就是說徐钠,如果子類實現(xiàn)了load方法癌刽,那么會先調(diào)用父類的load方法,然后又去執(zhí)行子類的load方法丹皱。同樣的妒穴,如果分類實現(xiàn)了load方法,也會先執(zhí)行主類的load方法摊崭,然后又會去執(zhí)行分類的load方法。所以父類的load會執(zhí)行很多次杰赛,這一點需要注意呢簸。而且執(zhí)行順序是 類 -> 子類 ->分類。而不同類之間的順序不一定乏屯。
+initialize
與load不同的是根时,initialize方法不一定會執(zhí)行。只有當一個類第一次被發(fā)送消息的時候會執(zhí)行辰晕,注意是第一次蛤迎。什么叫發(fā)送消息呢,就是執(zhí)行類的一些方法的時候含友。也就是說這個方法是懶加載替裆,沒有用到這個類就不會調(diào)用,可以節(jié)省系統(tǒng)資源窘问。
還有一點截然相反辆童,卻更符合我們預期的就是,initialize方法會覆蓋惠赫。也就是說如果子類實現(xiàn)了initialize方法把鉴,就不會執(zhí)行父類的了,直接執(zhí)行子類本身的儿咱。如果分類實現(xiàn)了initialize方法庭砍,也不會再執(zhí)行主類的场晶。所以initialize方法的執(zhí)行覆蓋順序是 分類 -> 子類 ->類。且只會有一個initialize方法被執(zhí)行怠缸。