問題思考
NStimer最為iOS開發(fā)中最常見的定時器鳄梅,使用簡單方便兄淫,但是在處理NStimer和target相互引用的問題時,需要提高警惕慰丛。因為NSTimer持有target悲幅,NStimer被runloop持有套鹅,導致如果不手動關掉NStimer對象站蝠,就會導致NSTimer和target的泄漏,而且因為這種關系卓鹿,導致target的dealloc方法是不會執(zhí)行的菱魔,但是想要造一個合適的時機去執(zhí)行NSTimer的失效,手動去處理就比較費勁吟孙,比如在ViewDidDisappear澜倦,你需要去判斷當前頁面是pop還是Push
解決思路
為了解決NStimer和Target之間的這種關系,我們需要讓target可以執(zhí)行其dealloc方法杰妓,然后我們在dealloc方法中執(zhí)行[NStimer invalidate]
解決辦法
- 我們將持有NStimer的對象藻治,不要作為target,target作為timer事件的執(zhí)行者巷挥,我們可以隨便找一個對象,甚至類對象去響應桩卵,然后持有NStimer的對象調用dealloc的時候,執(zhí)行[NSTimer invalidate]
- 但是這樣定時器事件執(zhí)行就不會再NSTimer的持有者對象里倍宾,這樣不便我們進行業(yè)務邏輯處理雏节,想要將NStimer的持有者響應方法也很容易,我們可以傳入block或者delegate高职,在target執(zhí)行定時器方法時钩乍,執(zhí)行block或者讓delegate去執(zhí)行,相當于將定時器方法又向外轉發(fā)一次