2011-10-19 8 views
2

次のような場合にメモリリークが発生するか、何らかの形で改善される可能性がありますか? countDownTimer = nilNSTimerのメモリリーク?

-(void)viewDidLoad{ 

countDownTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(loadNewTime:) userInfo:nil repeats:YES]; 
} 

    -(void)pauseTimer{ 

     NSLog(@"Fired"); 
     [countDownTimer invalidate]; 
     //countDownTimer = nil <------ Causes crash when run 
    } 


    -(void)resumeTimer{ 

     countDownTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(loadNewTime:) userInfo:nil repeats:YES]; 
    } 

答えて

1

NSTimerは、有効期限が切れたり無効になったときに自動的に保持カウントを減らします。あなたが保持しているivarにそれを割り当てていない限り、それをnilに等しくする必要はありません。 (あなたの場合は、self.countDownTimerを使用してタイマーを割り当てる必要があることを意味します)

1

を削除されると私はcountDownTimerがIVARであると仮定しますか? NSTimerは生存中にターゲットを保持しているため、[countDownTimer invalidate]への呼び出しが最後の参照をselfに解放し、-pauseTimerメソッドの途中でselfの割り当てを解除するように聞こえます。このように、selfへの参照は、暗黙的な参照(例:ivarsへのアクセス)さえもクラッシュするか、または少なくとも予期しない動作をします。

お電話は-pauseTimerですか?おそらく彼らはあなたのオブジェクトへの強い参照を持っているはずです。