2011-07-21 11 views
0

時には、オブジェクトを解放しないと混乱することがあります。私が持っている:リピート属性がYESのNSTimerをリリースする必要がありますか?

NSTimer *timer2; 

timer2 = [NSTimer scheduledTimerWithTimeInterval: (5) 
             target: self 
             selector: @selector(someMethod:) 
             userInfo: nil 
             repeats: YES]; 

とのは、5秒ごとに実行され得る方法は次のとおりです。

-(void) someMethod:(NSTimer*)theTimer 
{ 
    NSLog(@"code got executed"); 
} 

I持って私のルートビューコントローラ上の別のnibファイルを配置する別の方法:

ViewControllerObjetivos *control = [ViewControllerObjetivos alloc]; 

[control initWithNibName:@"ViewControllerObjetivos" bundle:nil]; 

UINavigationController *navControl = [[UINavigationController alloc] 
             initWithRootViewController:control]; 

[self presentModalViewController:navControl animated:NO]; 
[navControl setNavigationBarHidden:YES]; 

[control release]; 
[navControl release]; 

その最後のメソッドを呼び出すと、新しいnibファイルgetがルートビューコントローラに置かれます。そしていくつかのメソッドはまだ呼び出されます!

私はそれを初期化するために単語のinitまたはアロケーションやコピーを使用していなかったので、私はタイマ2を解放する必要がある場合ので、私は混乱しています。だから私は何をすると思いますか?私はそれを止めて、私が最後に示した方法を呼ぶべきでしょうか?私は新しいものと一緒に作業しているので、nibファイル全体をリリースする必要がありますか?

答えて

5

タイマーを停止する正しい方法は、そのinvalidateメソッドを呼び出しています。二度と発射から受信機を停止し、その実行ループからの除去を要求し

無効

。あなたのケースでは

(私は間違っていないよ場合)2番目のペン先を表示するとき、あなたは、つまり、あなたのクラスのIVARにtimer2を格納し、適切な瞬間に、それをinvalidateを送信することができます。そうしないと、あなたが目撃したように、タイマは永遠に動作したままになります。

あなたはNOrepeatsを設定し、タイマーが自動的に最初の時間を焼成した後に無効にする場合:

繰り返し

YESた場合、タイマーは繰り返し無効化されるまで、自分自身を再スケジュールします。 NOの場合、タイマーは起動後無効になります。

+0

私はNOに等しいオートリピートプロパティを設定している場合セルジオは私はまだinvalidateメソッドを呼び出す必要がありますか? –

+0

私の編集内容をご覧ください... – sergio

1

NSTimerのscheduledTimerWithTimeIntervalは所有するオブジェクトを返します。したがって、保持する必要はありません。後で無効にする(停止する)必要がある場合は、自分で保持する必要があります。

+1

自動返却されたオブジェクトは返されません。あなたが所有していないオブジェクトを返します。 –

+0

ありがとうございます。あなたは正しいです。 –

関連する問題