首先,說一下使用timer的誤區,很多同學喜歡這樣寫:
_timer = [NSTimer scheduledTimerWithTimeInterval:.5 target:self
selector:@selector(timerRun:)
userInfo:nil
repeats:YES];
然后在dealloc方法中釋放timer:
- (void)dealloc {
[_timer invalidate];
_timer = nil;
}
最終結果就是dealloc方法不調用,timer和本類對象都無法釋放,造成內存泄漏。
原因就是timer創建的時候target對self進行了強引用,而timer的釋放依賴于本類對象的釋放(即dealloc方法),造成循環引用。
解決這個最簡單的方法就是,再添加一個實例方法:
- (void)invalidate{
if (_timer) {
[_timer invalidate];
timer = nil;
}
}
在釋放之前主動調用一次,手動關閉timer(嫌麻煩的可以去網上找下自動關閉timer的方法,這里不做重點講解)。
這里有個小demo,分別用NSTimer和GCD_timer實現了主線程和分線程的定時器。
覺得好,就給個star!