我們都知道viewWillAppear:方法是在控制器的view將要顯示的時候調用的,而viewWillDisappear:方法是在控制器的view將要隱藏的時候調用。很多時候我們根據自身需要將相關代碼邏輯添加到這兩個方法中。
現在隨着手勢操作的流行,很多人在頁面中添加了左滑返回的功能,但是我們還是習慣性的把通知的移除放在了viewWillDisappear中,這樣就會出現一個問題,如果我左滑滑到一半又滑回去了,這時候頁面的通知已經移除了,整體的功能就會受到影響。
解決方法:
1、將注冊通知的方法放到viewDidLoad中;只要頁面有變化就會調用這個方法,頁面的通知監聽就會一直存在。
2、將移除通知的代碼放到dealloc方法中,dealloc方法是在控制器銷毀之時調用的。這個時候移除通知而不是在viewWillDisappear:方法中移除可以有效避免上述的問題。既然控制器都銷毀了,那么還留着相關的通知干嘛?該移除的移除。
上面的兩種解決方案,要說哪種最優,那肯定非第二種莫屬了。
在這里可以舉個例子。假如我們現在有這么個場景:在控制器的view上有個label,在label上添加一個手勢(一般手勢都是在創建完label之后添加的),假設我在viewWillDisappear:方法中移除該手勢,則此時用戶側滑返回之時又取消側滑返回,那么原先在label上的手勢卻再也添加不回來了(這里label一般在viewDidLoad方法中創建),因為viewDidLoad方法不會再次調用。而第二種方法卻可以有效避免這種情況,這樣就可以避免我這種“手賤”的任意搗鼓了,是不是很完美呢?
注意項:
用 [NSNotificationCenter defaultCenter] 發出的通知在控制器里面接收不用理會,控制器銷毀的時候會自動釋放不會野指針,但是在view里面接收通知的時候要在dealloc里面移除,否則會野指針。
總結:
1、iOS7新增加了導航控制器側滑手勢,當觸發側滑返回時,會調用系統的viewWillDisappear:方法,取消側滑返回時又會調用viewWillAppear:方法。
2、在做手勢和通知等一系列操作之時盡量在dealloc方法中執行,添加通知盡量在viewDidLoad等一次性方法中執行。
3、在viewWillAppear:、viewWillDisappear:、viewDidAppear:、viewDidDisappear:等類似於這種會多次調用的系統方法中添加代碼時,一定要多考慮業務邏輯,以免出現不必要的麻煩。