25

ループ アクションでautoreleasepoolに多くの自動解放されたオブジェクトを配置することをお勧めします。@autoreleasepool をループに入れている人もいましたが、@autoreleasepool にループを入れている人もいました。

1:

while ([rs next]) {
    @autoreleasepool {
        NSDictionary *dict = [self dictFromXX];
        //...
    }
}

2:

@autoreleasepool {
    while ([rs next]) {
        NSDictionary *dict = [self dictFromXX];
        //...
    }
}

どちらが良いですか?またはコード1と2の違いはありますか?

ありがとう!

4

6 に答える 6

33

すべての反復の最初の例では、プールが排出されます。これは、反復の本体に多数の自動解放オブジェクトが含まれる場合に意味があります。

2 番目の例では、ループ後にプールを 1 回だけ排出します。

したがって、ループの内部がメモリの膨張を引き起こしている場合は、オプション 1 に進みます。ループ全体でのメモリの膨張が許容できる場合は、ループしてからオプション 2 を使用します。

于 2012-04-12T10:09:00.440 に答える
3

最初の例では、 autoreleasepool は反復の開始時に作成され、反復の終了時に排出されます。2 番目のケースでは、プールが一度作成され、ループが終了した後にのみ破棄されます。2 番目のバリエーションを使用すると、自動解放されたすべてのオブジェクトが最後にのみ解放されるため、大きなメモリ オーバーヘッドが発生する可能性があります。ただし、処理する必要があるデータの量を考慮する必要があります。ほとんどの場合、2 番目のバリアントがより優先されます。

于 2012-04-12T10:05:36.243 に答える
1

私はバージョン2に行きます。

ブロックは、ブロックが終了したときに受け取っ@autoreleasepoolたすべてのオブジェクトを解放します。autoreleaseいくつかの CPU サイクルが必要なため、これには時間がかかります。オブジェクトによっては、使用時間が予想よりもはるかに長くなる可能性があります。

@autoreleasepoolcustomは、20MB を超える多くのデータを操作する場合、または非メインスレッドでデータを操作する場合にのみ意味があると思います。

そう。「短い」は避けることをお勧めし@autoreleasepoolます。実行が遅くなる可能性があるためです。

于 2012-04-12T10:03:18.257 に答える
0

@autoreleasepoolNSAutoreleasePoolブロックは、のインスタンスを直接使用するよりも効率的です。ARCを使用しなくても使用できます。-NSAutoreleasePoolクラスリファレンス

通常、自動解放プールは必要ありません。ループ内にあり、多数のオブジェクトを自動解放するために必要な場合は、ループによって発生するスパイクを回避しようとしているため、オプション1の方が2よりも理にかなっています。オプション2を使用するのは、自動解放プールが設定されていない場合(たとえば、バックグラウンドまたはでセレクターを実行している場合+load)ですが、とにかくそれらにはGCDを使用するようにしてください。

要約すると、あまり長いメソッドがなく、自動解放プールでループをラップする必要がある場合は、ほとんどの場合、オプション1を選択してください。自動解放プールが設定されていない状態でメソッドが呼び出されている場合は@autorelease、最初に行う必要があります。

于 2012-04-12T10:22:09.697 に答える
0

Core Data と autoreleasepools を使用した別のアプローチを次に示します。

あなたにとって重要なデータを効率的にインポートするための非常に大きな階層データセットを使用してコアデータをテストWrap the contents of the outer loop in an NSAutoreleasePool init/release and NSManagedObjectContext saveすることが解決策です。

于 2012-04-12T10:00:16.637 に答える
0

保留中のアイテムがいくつリリースされるかによって異なります。自動解放プールをゴミ箱のように、未使用のものを入れて後で捨てるイメージ。

于 2012-04-12T10:10:07.627 に答える