2009-03-02 1 views
3

私はそれをきちんと整理するためにいくつかのコードに戻ってきました。そして、私はscheduledTimerWithTimeInterval:target:selector:userInfo:repeats:から返されたNSTimersを保持し、それらをフィールドに格納しています。場合によっては、タイマーを使用して後で無効化メッセージを送信しますが、多くの場合はそうではありません。スケジュールされたNSTimerを無効にする必要がない場合は、それを保持する理由はありますか?

最近のコードでは、通常、タイマーをスケジュールして忘れてしまいます。私はコンストラクタメソッドがオートリリースしていることを理解しており、タイマーは実行中に実行ループによって保持されているので、この問題は発生しません。

私の理解を丸めるために、私は自分のタイマーを保持する必要がある他の理由があるのでしょうか、私は現在受け入れられているイディオムをやっていますか?

これはすべてiPhoneコードの文脈にありますが、iPhone固有のものではないと思います。

答えて

3

私はちょうど実行ループに保持を処理させてくれました。それは自分自身ではなくタイマーを所有する実行ループです。もしあなたが私の言いたいことを見たら。

+0

はい、これは実際にはメモリ管理の質問ではありませんが、私はそこに誤解されていたことがあった場合の私の言葉にそれを含めました。つまり、もし私がそれを参照していたら、とにかくそれを保持していたはずです。 – philsquared

1

私は自分自身の質問に答えています。

私はクラス参照ドキュメントを参照していたので、ほとんどの質問をしていましたが、この問題は実際にはっきりしませんでした。私はそれ以来、Timer Programming Topics:ADCでのTimersの使用に関する記事を読んできました。それはかなりうまくカバーしています。特に、最後のメモリ管理に関するセクションです。

私が今やっていること(ちょうどスケジューリング、私が無効化、またはisValidなどを呼び出すことができる必要がない限り)は正しい方法です。

+0

私は無効化のための私の呼び出しがクラッシュした理由を理解しようとしている私の頭を叩いている!私はタイマーを保持していませんでした。しかし、あなたがif(myTimer){[myTimer invalidate];}を使用すると、タイマーが保持されずにクラッシュするので、なぜIFステートメントで取得されたのか分かりませんが、これは解決したようです! – jsherk

+0

ここに関連記事があります:http://stackoverflow.com/questions/9399669/iphone-crash-message-sent-to-deallocated-instance – jsherk

+0

@jsherk - 未取得のタイマーがあなたの前にリリースされている場合、ポインタはまだ値を持っています - それは割り当てられたオブジェクトを指していません(少なくともあなたが思っていたものではありません)ので、クラッシュはまさにあなたが除外したいものです(ただし、さらに悪いことに、 !) – philsquared

関連する問題