2

私のView Controllerコードの1つに、次の行があります。

[NSTimer scheduledTimerWithTimeInterval:7.0 target:self selector:@selector(doSomethingOnce) userInfo:nil repeats:NO];

これは 7 秒後に呼び出され、何かを実行します... (変数またはプロパティにタイマーを割り当てません)

7 秒が経過する前にビュー コントローラーが解放された場合はどうなりますか?

ある時点で (つまり、dealloc で) タイマーを解放および/または無効にする必要がありますか?

4

2 に答える 2

5
于 2013-06-03T23:54:25.620 に答える
3

タイマーを変数に割り当ててから、View ControllerのviewWillDisappear(またはviewDidDisappearおそらく)メソッドでタイマーを明示的に無効にして、変数をnilに再割り当てする必要があります。とにかくこのタイマーを繰り返したくないので、doSomethingメソッドの最後でタイマーを nil に割り当てることもできます。

タイマーがターゲットを保持するという事実は、7 秒が経過する前に View Controller の割り当てが解除されるのを防ぎますが、View Controller が通常の外観関連のメッセージを受け取るのを防ぐことはできません。

たとえば、次のようにします。

_doSomethingTimer = [NSTimer scheduledTimerWithTimeInterval:7.0 target:self selector:@selector(doSomethingOnce) userInfo:nil repeats:NO];
// The rest of whatever method this is in.
…

- (void)viewWillDisappear:(BOOL)animated {
    [_doSomethingTimer invalidate];
    _doSomethingTimer = nil;
}
于 2013-06-03T23:59:55.347 に答える