2009-08-14 13 views
0

戻り値(printfなど)を持っていても、メソッドが無効であるかのようにメソッドを呼び出すことはできますが、これはどうですか?目的c - 戻り値を使用しないオブジェクト返却メソッド

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

返すオブジェクトを使用せずにそこにフローティングさせることはできますか?これは、[NSObject alloc]をポインタや何かに代入することなく呼び出すようなものです。それはメモリーリークですか?その理由は、変数(タイマー)に割り当てたいのではないからです。なぜなら、私がリリースする(またはオートレアセット)と、それが発生する前に削除されるからです。そして、私は象牙を使用したくありません。だから何をすべきか?

編集:私は[self performSelector:@selector(myMethod)withObject:nil afterDelay:0.3]を発見しました。タイマーを使用するよりもはるかに優れています。

答えて

2

この呼び出しで作成されたNSTimerは、現在のNSRunLoopオブジェクトによって所有されているため、自動解放プールのドレインによって自動解放されることはありません。手動でリリースするのは間違いです。タイマーがインストールされた同じスレッドからタイマーを無効化メッセージを送信し、NSRunLoopオブジェクトからタイマーの削除を要求するには

:NSTimerは、それがメッセージを無効に送信することにより除去しなければなりません。このメッセージはすぐにタイマーを無効にするので、NSRunLoopオブジェクトには影響しません。実行ループは、無効化メソッドが返される直前または後で、タイマーを削除して解放します。

だから、基本的に、あなたはそれのための変数を持っているし、代わりにリリース

+0

無効を使用する必要がありますちょうどそれが発火するとき、それは無効にする方法はありますか?それは繰り返されません..メモリリークがある場合を除いて、これは完璧に動作しています。リークはリークがあるとは言わず、タイマオブジェクトは決してポインタに割り当てられません。 – mk12

+0

私はそれを理解しました、私はタイマーが引数としてそれ自身を渡すのを知らなかった。だから私はタイマーを無効にする必要があり、それをリリースしないと言う? – mk12

+0

無効にした後で解放しようとしたため、あなたが正しくなければなりません。それはクラッシュしました...ありがとう! – mk12

関連する問題