NSTimerを持つクラスがありますが、リリースすると、invalidateも呼び出されますか?または、両方をdeallocで実行できますか?
- (void)dealloc
{
[_timer invalidate];
[_timer release];
[super dealloc];
}
私はこのスレッドで読んだ:
選んだ答えは、invalidateメソッドもリリースを行うと言っているので、無効にした場合、リリースする必要はありませんか?
ありがとう!
NSTimerを持つクラスがありますが、リリースすると、invalidateも呼び出されますか?または、両方をdeallocで実行できますか?
- (void)dealloc
{
[_timer invalidate];
[_timer release];
[super dealloc];
}
私はこのスレッドで読んだ:
選んだ答えは、invalidateメソッドもリリースを行うと言っているので、無効にした場合、リリースする必要はありませんか?
ありがとう!
に送信releaseしてNSTimerも無効にはなりません。
が実行ループでスケジュールされている場合NSTimer、実行ループはタイマーを保持します。したがって、(スケジュールされた)タイマーを解放しても、保持カウントはゼロより大きくなります。また、発砲し続けます。タイマーのターゲットの割り当てが解除されている場合、タイマーが起動するとアプリがクラッシュする可能性があります。
スケジュールされたタイマーに送信invalidateすると、実行ループがタイマーを解放します。
NSTimerが実行ループでスケジュールされていない場合は、無効にする必要はありません。invalidateただし、タイマーがスケジュールされているか、スケジュールされていないか、すでに無効になっているかにかかわらず、タイマーに送信しても安全です。
したがって、すでに無効になっていることが確実でない限りinvalidate、メソッドでタイマーを送信する必要があります。dealloc
を使用してタイマーを作成した場合は[[NSTimer alloc] initWith...]、それも解放する必要があります。ただし、[NSTimer timerWith...]またはを使用してタイマーを作成した場合は、タイマーへの参照を所有していないため、タイマーを解放しないでください[NSTimer scheduledTimerWith...]。