12

NSTimerユーザーがボタンをタップした場合、またはビューを終了した場合に無効にする必要があるオブジェクトがあります。

ので、私は持っています:

[myNSTimer invalidate];

ボタンハンドラーの内部と内部viewWillDisappear。ユーザーがボタンをタップしてからビューが存在する場合、myNSTimerすでに無効になっているため、アプリは例外をスローします。viewWillDisappearメソッドで行う必要があるのは、myNSTimerが無効になっているかどうかを確認することです。それ、どうやったら出来るの?

私はもう試した:

if(myNSTimer != nil)
  [myNSTimer invalidate];

しかし、それはうまくいきませんでした。

4

4 に答える 4

33

タイマーを無効にしたら、それを呼び出しreleaseて (保持している参照を保持していると仮定して)、参照を無効にします。そうすれば、ビューを終了するときに、タイマーをもう一度無効にしようとすると、代わりにそのメソッドが nil で呼び出され、何も実行されません。

または、無効にする前に有効かどうかを確認するために使用できますが-[NSTimer isValid]、最初に無効にした後に参照を保持する理由はありません。また、実際の問題が参照を保持していないことであり、最初-invalidateにリリースされたオブジェクトを指す参照が実際に残っている場合は、-isValidとにかく呼び出しても役に立ちません。

于 2008-12-15T12:47:43.693 に答える
6

私が通常行うことは、タイマーが起動するとき、またはタイマーを無効にするときに、タイマーを保持するメンバー変数を nil-out することです。次に、次のことができます。

[myNSTimer invalidate]; 
myNSTimer = nil;

そしてそれは正しいことをします。

于 2008-12-15T13:38:21.830 に答える
3

タイマーを一時停止して再起動しようとしているときに、同じ問題が発生しました。停止するには:

[timer invalidate];
[timer release];
timer = nil;

そしてそれを開始/再起動するには:

timer = [[NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(aSelector) userInfo:nil repeats:YES] retain];

無効にしてもクラッシュしなくなりました。

于 2012-10-11T08:40:22.310 に答える
1

迅速:

if timer.valid {
   timer.invalidate()
}
于 2016-04-19T23:13:31.113 に答える