2

変数を持つクラスがありNSTimer *myTimer;ます。ある時点で私はします:

myTimer = [NSTimer scheduledTimerWithTimeInterval:20 target:self selector:@selector(doStuff) userInfo:nil repeats: YES]; 

さらに、私は方法があります:

- (void)doStuff
{
  if(myTimer)
  {
    //do stuff
  }
}

そして、クラスが次の方法で解放されたら、タイマーを停止します。

- (void)dealloc
{ 
 if (myTimer) { //if myTimer==nil it already has been stopped in the same way
  [myTimer invalidate];
  myTimer = nil;
 }
}

さて、問題は、クラスを解放すると、とにかくイベントが発生し続けるということです。私は何か間違ったことをしていますか?deallocメソッドが呼び出されることはないようです。そうしないと、myTimerはnilになり、セレクターが起動されても、if(myTimer)

4

2 に答える 2

7

タイマーはターゲットを保持するため、これは機能しません。つまり、タイマーが終了deallocするまでメソッドが呼び出されることはありません。invalidated

詳細については、「危険なココアコール」NSTimerに関するドキュメントとこのブログ投稿を参照してください。

于 2010-09-20T16:07:43.403 に答える
0

便利なデバッガツールを自由に試してみましたか?Deallocメソッドにブレークポイントを設定するとどうなりますか?また、作成に関するコンテキストをもっと投稿する必要があります。タイマーを複数回作成し、それによって元のタイマーを置き換えて(ただし、無効にしないで)、自由に起動できるようにすることは可能ですか?

于 2010-09-20T16:08:11.060 に答える