0

NSTimerを持つクラスがありますが、リリースすると、invalidateも呼び出されますか?または、両方をdeallocで実行できますか?

- (void)dealloc
{
    [_timer invalidate];
    [_timer release];
    [super dealloc];
}

私はこのスレッドで読んだ:

メソッド呼び出しの無効化もリリースを行います

選んだ答えは、invalidateメソッドもリリースを行うと言っているので、無効にした場合、リリースする必要はありませんか?

ありがとう!

4

1 に答える 1

10

に送信releaseしてNSTimerも無効にはなりません。

が実行ループでスケジュールされている場合NSTimer、実行ループはタイマーを保持します。したがって、(スケジュールされた)タイマーを解放しても、保持カウントはゼロより大きくなります。また、発砲し続けます。タイマーのターゲットの割り当てが解除されている場合、タイマーが起動するとアプリがクラッシュする可能性があります。

スケジュールされたタイマーに送信invalidateすると、実行ループがタイマーを解放します。

NSTimerが実行ループでスケジュールされていない場合は、無効にする必要はありません。invalidateただし、タイマーがスケジュールされているか、スケジュールされていないか、すでに無効になっているかにかかわらず、タイマーに送信しても安全です。

したがって、すでに無効になっていることが確実でない限りinvalidate、メソッドでタイマーを送信する必要があります。dealloc

を使用してタイマーを作成した場合は[[NSTimer alloc] initWith...]、それも解放する必要があります。ただし、[NSTimer timerWith...]またはを使用してタイマーを作成した場合は、タイマーへの参照を所有していないため、タイマーを解放しないでください[NSTimer scheduledTimerWith...]

于 2012-08-07T06:52:53.353 に答える