NSTimer的循環(huán)引用問(wèn)題是由于NSTimer會(huì)對(duì)target進(jìn)行強(qiáng)引用,而如果在target中又使用了NSTimer,就會(huì)出現(xiàn)循環(huán)引用的問(wèn)題。
為了解決這個(gè)問(wèn)題,可以采用以下兩種方法之一:
使用weak引用:在target對(duì)象中使用weak引用來(lái)引用NSTimer。這樣NSTimer對(duì)target對(duì)象的引用就變?yōu)槿跻?,不?huì)造成循環(huán)引用??梢酝ㄟ^(guò)使用GCD的定時(shí)器來(lái)替代NSTimer,GCD的定時(shí)器對(duì)target對(duì)象的引用是弱引用,不會(huì)造成循環(huán)引用。
手動(dòng)釋放NSTimer:在合適的時(shí)機(jī)手動(dòng)釋放NSTimer??梢栽趖arget對(duì)象的dealloc方法中調(diào)用NSTimer的invalidate方法來(lái)釋放NSTimer。
以下是兩種方法的示例代碼:
__weak typeof(self) weakSelf = self;
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:weakSelf selector:@selector(timerAction) userInfo:nil repeats:YES];
- (void)dealloc {
[self.timer invalidate];
self.timer = nil;
}
通過(guò)以上兩種方法,可以有效避免NSTimer的循環(huán)引用問(wèn)題。