2009-08-14 25 views
0

非常に頻繁に呼び出されるメソッドでオブジェクトを割り当てて初期化し、直ちに解放しないとオブジェクトがメモリの悪夢になるのですか?オブジェクトがすでにメモリに入っている場合、allocとinitは無視されますか?メモリ割り当てとループ

これは私が説明するのがやや難しいです、申し訳ありません!

ありがとうございました。

答えて

1

ガベージコレクションがないと、問題のオブジェクトがオートレリースされていないと、それをリリースしたインスタンスは消えます。オブジェクトがオートレリースされていても、独自のオートレリースプールを作ってループをラップすることができます。

ガベージコレクションでは、予測が少し難しくなりますが、ガベージコレクタは、すべて互いに近くに割り当てられたオブジェクトを適切に処理する必要があります。

0

あなたは正確にやっていることを知ることがなければ、それは言うのは難しいですが、あなたがやっているように聞こえるが:あなたが

をやったかのように、リークします

for (...) 
    [[Foo alloc] init]; 

その場合

for (...) 
    malloc(...) 

または

for (...) 
    new ...; 

あなたはGC環境にいる場合、これは問題ではありません(OBJの-C 2で、GCが保持/ relea有効でseは全く効果がありません)。 GCを使用していない場合は、割り当てたすべてのオブジェクトがリークしています。

あなたは

for (...) 
    [[[Foo alloc] init] autorelease] 

ような何かをやっている場合は、イベントループ(すなわちのトップに戻るまで、また、あなたが無限にリークされませんが、あなたのインスタンス化されたオブジェクトのどれもが収集されません。あなたのイベントハンドラが終了します)。この場合、長期間に渡って実際に漏れることなく、一度に多くのメモリを使用することになります。

+0

私はこのメソッドを、タイマーが起動するたびに呼びます(毎秒数回です)。私はGC環境にいません。ありがとう。 –

+0

あなたは何をしていますか? '[[Foo alloc] init]'または '[[Foo alloc] init] autorelease]'? – olliej

0

コードをプロファイリングしましたか?もしそうなら、あなたはこれがホットスポットかどうかを知っています。もしそうでなければ、あなたは暗闇の中で働いています。

あなたは「タイマが起動するたびに毎秒このメソッドを呼び出していますが、毎秒数回です」と述べました。この場合、オブジェクトに数回メモリを割り当てるコストは全くかかりません秒は完全に無視できる。