2009-05-12 19 views
0

(私はここではアップル社のメモリ管理ガイドだけでなく、他のメモリ管理のヘルプを読んで、しかし、次のようにまだ混乱していています)私はループ内で便利なメソッドとメモリ管理のために何をすべきココア自動解放

?明示的に自動解放プールを作成して排液する必要がありますか?それとも、すべてオートマチックですか?

この例では、lastPathComponentから新しい文字列を繰り返し取得しています。一度同じことを繰り返すと、このメモリ管理状況をどのように扱うべきですか?

'componentString'は保持されず、ループ内でのみ有効で、他の文字列との比較にのみ使用されます。助けてくれてありがとう。

答えて

6

実行ループが終了すると、自動解放プールは、通常、制御がユーザーに戻ったときにメソッドの終了時に排水されます。何度も繰り返し実行されていて、オートレリースされたオブジェクト(メソッドが終了するまでメモリに蓄積される)がたくさん生成された場合は、ローカルの自動解放プールを作成して自分自身で削除することをお勧めします。

ローカルの自動解放プールは、新しいインスタンスをインスタンス化して解放するだけで作成および排除できます。

for (i=0; i<10000; i++) { 
    NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init]; 
    NSString *aString = [NSString string]; 
    [pool drain]; 
} 

あなたが作成し、プールを作成し、リリースする(100のごとのループまたはそう言う)の反復の一定数をチェックすることもできますので、あまりにも多くのプールを解放した場合、パフォーマンスヒットがありそうです。セットナンバーがないので、遊んでみる必要があります。

更新日:[pool release]から[pool drain]に更新され、Marc Charbonneauの推奨でガベージコレクションとの将来の互換性が維持されます。

+4

Appleはガベージコレクションとの将来の互換性のためにリリースの代わりに[プールドレイン]を呼び出すことをお勧めしますが、マネージメモリアプリケーションでは同じことをします。 –

+0

NSAutoreleasePool呼び出しをforループの外側に配置したくないですか? –

+0

@マーク - それはここの目的を破るだろう...問題は、あなたがメモリを解放することについてもっと積極的になりたいと思った大きなループを持つことにあった。私は、このようなループ内で具体的に割り当てられたインスタンス(私ができるならば)を使い、それがより良い実行をするのでループの終わりに解放することを好む。 –

関連する問題