Load 與 Initialize方法
1. load方法的調(diào)用順序
大的順序是 類
> 分類
鹃锈。
在類中:
1. 按照compile sources的類順序調(diào)用
2. 父類先于子類
各個(gè)分類則按compile sources
內(nèi)的順序調(diào)用。
例如當(dāng)前工程中compile sources
內(nèi)容為
MyViewController.m (subclass of ViewController)
MyViewController+category.m
AppDelegate.m
ViewController+category.m
ViewController.m
則, load方法調(diào)用順序?yàn)椋?code>ViewController -> MyViewController
-> AppDelegate
-> MyViewController+category
-> ViewController+category
2. 二者區(qū)別
+ load
方法在Runtime中的調(diào)用方式為(*load_method)(cls, SEL_load)
疗认,load_method是指向load函數(shù)的指針,用的是調(diào)用函數(shù)的方法骏掀。
+ load
方法是當(dāng)類或分類被添加到 Objective-C runtime 時(shí)被調(diào)用的雾棺。
+ initialize
方法是在類或它的子類收到第一條消息之前被調(diào)用的,這里所指的消息包括實(shí)例方法和類方法的調(diào)用逝慧。
+ Initialize
方法在Runtime中調(diào)用方式為((void(*)(Class, SEL))objc_msgSend)(cls, SEL_initialize)
, 用的是發(fā)送消息的方法昔脯。
因此一方面如果+ Initialize
方法寫在分類中,會(huì)覆蓋原來的類方法笛臣,而+ load
則不會(huì)云稚;另一方面,消息發(fā)送沈堡,子類不實(shí)現(xiàn)會(huì)從父類中查找静陈,如果一個(gè)類有多個(gè)子類都不實(shí)現(xiàn)+ Initialize
方法,則父類的+ Initialize
方法會(huì)被調(diào)用多次诞丽。因此鲸拥,Method_Swizzle都會(huì)寫在+ load
方法中。