上一篇:iOS性能優(yōu)化(二)UITableView自動(dòng)計(jì)算Cell高度思路
在了解這個(gè)問題之前蜂林,我們先復(fù)習(xí)一下:iOS 視圖生命周期
initWithCoder:(NSCoder *)aDecoder:使用Storyboard或者Xib創(chuàng)建View的的時(shí)候
loadView:加載view的時(shí)候
viewDidLoad:view加載完畢的時(shí)候
viewWillAppear:控制器的view將要顯示的時(shí)候
viewWillLayoutSubviews:控制器的view將要布局子控件的時(shí)候
viewDidLayoutSubviews:控制器的view布局子控件完成的時(shí)候
viewDidAppear:控制器的view完全顯示的時(shí)候
viewWillDisappear:控制器的view即將消失的時(shí)候
viewDidDisappear:控制器的view完全消失的時(shí)候
deinit:控制器銷毀的時(shí)候
首先挪钓,我們新建一個(gè)空的工程娇跟,在工程中添加兩個(gè)控制器:頁面01饭聚,頁面02糖权。然后重寫以下方法:
override func loadView() {
super.loadView()
print("--- 頁面01 - loadView 創(chuàng)建View ---")
}
override func viewDidLoad() {
super.viewDidLoad()
print("--- 頁面01 - viewDidLoad 初始化完畢 ---")
}
override func viewWillAppear(_ animated: Bool) {
print("--- 頁面01 - viewWillAppear 將要顯示 ---")
}
override func viewDidAppear(_ animated: Bool) {
print("--- 頁面01 - viewDidAppear 顯示 ---")
}
override func viewWillDisappear(_ animated: Bool) {
print("--- 頁面01 - viewWillDisappear 將要消失 ---")
}
override func viewDidDisappear(_ animated: Bool) {
print("--- 頁面01 - viewDidDisappear 消失 ---")
}
deinit {
print("--- 頁面01 - deinit 銷毀 ---")
}
頁面02類似举畸,也是重寫以上方法箕别。
接下來是重點(diǎn)了:
1和簸、啟動(dòng)工程彭雾,終端日志:
---頁面01 - loadView創(chuàng)建View ---
---頁面01 - viewDidLoad初始化完畢---
---頁面01 - viewWillAppear將要顯示---
---頁面01 - viewDidAppear顯示---
2、頁面01 Push到 頁面02锁保,終端日志:
---頁面02 - loadView創(chuàng)建View ---
---頁面02 - viewDidLoad初始化完畢---
---頁面01 - viewWillDisappear將要消失---
---頁面02 - viewWillAppear將要顯示---
---頁面01 - viewDidDisappear消失---
分析:
在頁面02顯示之前(---頁面02 - viewWillAppear將要顯示---)薯酝,分別調(diào)用了三個(gè)方法,如果在這三個(gè)方法中有耗時(shí)操作爽柒,那么就會(huì)造成卡頓吴菠。
我們修改一下代碼,在頁面01中加入耗時(shí)操作:
override func viewWillDisappear(_ animated: Bool) {
print("--- 頁面01 - viewWillDisappear 將要消失 ---")
sleep(3)
}
此時(shí)由頁面01Push到頁面02浩村,就會(huì)卡頓(可以看到做葵,按鈕已經(jīng)響應(yīng)了事件,但頁面02沒有Push過來)心墅。
然后我們把耗時(shí)的代碼修改到:
override func viewDidDisappear(_animated:Bool) {
print("--- 頁面01 - viewDidDisappear 消失 ---")
sleep(3)
}
再次由頁面01Push到頁面02酿矢,不會(huì)卡頓。
3怎燥、頁面02Pop回頁面01瘫筐,終端日志:
---頁面02 - viewWillDisappear將要消失---
---頁面01 - viewWillAppear將要顯示---
---頁面02 - viewDidDisappear消失---
---頁面01 - viewDidAppear顯示---
---頁面02 - deinit銷毀---
分析:
在頁面01再次顯示的時(shí)候(---頁面01 - viewWillAppear將要顯示---),會(huì)調(diào)用頁面02的viewWillDisappear方法铐姚,如果在這個(gè)方法中有耗時(shí)操作策肝,就會(huì)引起Pop時(shí)卡頓。
總結(jié):
在開發(fā)時(shí),不要將耗時(shí)操作放在頁面顯示之前調(diào)用驳糯。比如:如果一個(gè)頁面消失時(shí)需要執(zhí)行一些操作篇梭,可以放在viewDidDisappear方法中執(zhí)行,不要放在viewWillDisappear中酝枢。
Android開發(fā)中恬偷,如果在主線有超過5秒的耗時(shí)操作,就會(huì)導(dǎo)致 Force Close帘睦。雖然iOS沒有這種機(jī)制袍患,系統(tǒng)不會(huì)殺掉我們的應(yīng)用,但如果有這種情況竣付,建議放在子線程中去執(zhí)行诡延。