+(void)load
* 在main之前,類被加載到系統(tǒng)時(shí)調(diào)用。
+(void)initialize
* 類首次收到消息時(shí)調(diào)用,若此類未被使用過,+(void)initialize就不會調(diào)用。
* 與+load方法類似的時(shí),在向子類發(fā)送initialize消息前,總是會先向父類發(fā)送initialize消息,如果父類尚未調(diào)用+initialize方法則調(diào)用。
* 如果父類中實(shí)現(xiàn)了+initialize方法,而子類中沒有重寫此方法,在子類收到消息的時(shí)候,會調(diào)用兩次initialize,一次是父類調(diào)用的,一次是子類調(diào)用的。
* Category中的+initialize方法會覆蓋類本身的+initialize方法。
-(instancetype)init
* 類實(shí)例化(new)的時(shí)候就會調(diào)用一次。 [ClassName new]相當(dāng)于[[class alloc]init]
* 只要new一次,init就會調(diào)用一次,new多少次,init就調(diào)用多少次,但initialize只會調(diào)用一次
* 調(diào)用順序 load、initialize、init
總結(jié)
+(void)load和+(void)initialize、-(instancetype)init對比如下:
| +(void)load | +(void)initialize | -(instancetype)init | |
|---|---|---|---|
| 調(diào)用時(shí)機(jī) | 被添加到 runtime 時(shí) | 收到第一條消息前,可能永遠(yuǎn)不調(diào)用 | 對象初始化時(shí) |
| 調(diào)用順序 | 父類->子類->分類 | 父類->子類 | |
| 調(diào)用次數(shù) | 1次 | 多次 | 多次 |
| 是否需要顯式調(diào)用父類實(shí)現(xiàn) | 否 | 否 | |
| 是否沿用父類的實(shí)現(xiàn) | 否 | 是 | |
| 分類中的實(shí)現(xiàn) | 類和分類都執(zhí)行 | 覆蓋類中的方法,只執(zhí)行分類的實(shí)現(xiàn) |
另外:
* 視圖控制對象通過alloc和init來創(chuàng)建,但是視圖控制對象不會在創(chuàng)建的那一刻就馬上創(chuàng)建相應(yīng)的視圖,
而是等到需要使用的時(shí)候才通過調(diào)用loadView來創(chuàng)建,這樣的做法能提高內(nèi)存的使用率.
* viewDidLoad-加載視圖
* viewWillAppear-UIViewController對象的視圖即將加入窗口時(shí)調(diào)用;
* viewDidApper-UIViewController對象的視圖已經(jīng)加入到窗口時(shí)調(diào)用;
* viewWillDisappear-UIViewController對象的視圖即將消失、被覆蓋或是隱藏時(shí)調(diào)用;
* viewDidDisappear-UIViewController對象的視圖已經(jīng)消失、被覆蓋或是隱藏時(shí)調(diào)用;
參考:偉哥