我們經(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)模塊代碼.