問題思考
NStimer最為iOS開發(fā)中最常見的定時(shí)器,使用簡(jiǎn)單方便,但是在處理NStimer和target相互引用的問題時(shí),需要提高警惕。因?yàn)镹STimer持有target,NStimer被runloop持有,導(dǎo)致如果不手動(dòng)關(guān)掉NStimer對(duì)象,就會(huì)導(dǎo)致NSTimer和target的泄漏,而且因?yàn)檫@種關(guān)系,導(dǎo)致target的dealloc方法是不會(huì)執(zhí)行的,但是想要造一個(gè)合適的時(shí)機(jī)去執(zhí)行NSTimer的失效,手動(dòng)去處理就比較費(fèi)勁,比如在ViewDidDisappear,你需要去判斷當(dāng)前頁面是pop還是Push
解決思路
為了解決NStimer和Target之間的這種關(guān)系,我們需要讓target可以執(zhí)行其dealloc方法,然后我們?cè)赿ealloc方法中執(zhí)行[NStimer invalidate]
解決辦法
- 我們將持有NStimer的對(duì)象,不要作為target,target作為timer事件的執(zhí)行者,我們可以隨便找一個(gè)對(duì)象,甚至類對(duì)象去響應(yīng),然后持有NStimer的對(duì)象調(diào)用dealloc的時(shí)候,執(zhí)行[NSTimer invalidate]
- 但是這樣定時(shí)器事件執(zhí)行就不會(huì)再NSTimer的持有者對(duì)象里,這樣不便我們進(jìn)行業(yè)務(wù)邏輯處理,想要將NStimer的持有者響應(yīng)方法也很容易,我們可以傳入block或者delegate,在target執(zhí)行定時(shí)器方法時(shí),執(zhí)行block或者讓delegate去執(zhí)行,相當(dāng)于將定時(shí)器方法又向外轉(zhuǎn)發(fā)一次
關(guān)系圖展示

image.png