NSTimerの循環参照問題
NSTimer はターゲットを強く参照するため、ターゲットで NSTimer を使用すると循環参照が発生します。
この問題に対処するには、次の2つの方法のいずれかの採用が考えられます。
- NSTimerではweak参照を利用:NSTimerからtargetオブジェクトへの参照がweak参照となり、循環参照を回避します。GCDタイマーを利用することで、targetオブジェクトへの参照はweak参照になるため、循環参照を回避できます。
- 適切なタイミングでNSTimerを手動で解放:targetのdeallocメソッドでNSTimerのinvalidateメソッドを呼び出すことでNSTimerを解放できます。
以下に、二つの方法のサンプルコードを示します。
- weak参照を使う:
__weak typeof(self) weakSelf = self;
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:weakSelf selector:@selector(timerAction) userInfo:nil repeats:YES];
- NSTimerを手動で解放する:
- (void)dealloc {
[self.timer invalidate];
self.timer = nil;
}
これら 2 つの方法により NSTimer の循環参照問題を効果的に回避できます。