【IOS】自定義View添加NSTimer導(dǎo)致不釋放的問題

我們經(jīng)常需要在自定義視圖中添加動(dòng)畫.很多動(dòng)畫都需要用定時(shí)器實(shí)現(xiàn).
但是如果我們?cè)谧远xview中添加定時(shí)器,如果不手動(dòng)釋放只是在

-(void)dealloc {
    [_timer invalidate];
}

這樣寫如果你打斷點(diǎn)調(diào)試,就會(huì)發(fā)現(xiàn),即使ViewController退出了,這個(gè)方法仍然不會(huì)釋放.

也就是我們這個(gè)自定義的View永遠(yuǎn)不會(huì)被釋放掉了.同樣,這個(gè)定時(shí)器也會(huì)一直運(yùn)行.

這個(gè)問題如果當(dāng)時(shí)沒有多想一下,很容易忽略,因?yàn)榫幾g不會(huì)有任何問題和提示.

因?yàn)?code>NSTImer 會(huì)強(qiáng)引用self——你的擁有NSTimer的那個(gè)view,因此形成了一個(gè)循環(huán)引用。只有在NSTimer invalidate之后才會(huì)釋放self。

因此一種解決辦法就是在ViewController的dealloc()里主動(dòng) invalidate一下view里的timer。

但是我覺得在viewController中去停止子視圖中的Timer并不好, 不符合封裝的思想.

所以我們可以在willMoveToSuperview:方法中停止定時(shí)器.

- (void)willMoveToSuperview:(UIView *)newSuperview {
    [super willMoveToSuperview:newSuperview];
    if (! newSuperview && self.timer) {
        // 銷毀定時(shí)器
        [self.timer invalidate];
        self.timer = nil;
    }
}

運(yùn)行之后發(fā)現(xiàn),ViewController退出之后,view執(zhí)行dealloc()方法
以后用到Timer的時(shí)候,千萬記得要想想有沒有忽略什么.
完美解決!

Demo地址:https://github.com/yuying2012/WJDStudyLibrary
這是一個(gè)大工程,請(qǐng)從工程中尋找相關(guān)模塊代碼.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容