1

メソッド内のARCコードで@autoreleasepoolを使用する利点があるかどうか疑問に思っています。

私はこれを意味します。順番に数回呼び出されるメモリを大量に消費するメソッドがあるとします。何かのようなもの

// this is my code
for (id oneObject in objects {
  [self letsUseMemory];
}

その後

- (void) letsUseMemory {

  // heavy use of memory here

}

そして私はこれをします

- (void) letsUseMemory {

  @autoreleasepool {

    // heavy use of memory here

  }

}

何かメリットはありますか?つまり、メソッドが終了すると、メソッド変数の割り当てが解除されるので、理論的には、そこに自動リリースプールを追加すると、何らかのメリットがありますよね?

または、そのメソッド内のautoreleasepoolは割り当て解除を高速化しますか?

ありがとう。

4

2 に答える 2

3

何かメリットはありますか?つまり、メソッドが終了するとメソッド変数の割り当てが解除されるので、そこに autoreleasepool を追加すると、理論的にはメリットがありますよね?

場合によります。自動解放された一時オブジェクトは、ARC を使用しているかどうかに関係なく、プールが空になるまで割り当て解除されません。すなわち:

NSString* foo = [NSString stringWithFormat:@"Bar: %@", baz];

@autoreleasepool を囲まないと、実行ループに戻るまでそのオブジェクト インスタンスがハングアップする可能性があります。そのコード行がループ内に存在する場合、これらの一時オブジェクトが大量に蓄積されている可能性があります。

一般的な経験則として、自動解放されたオブジェクトを作成する可能性のある大きなループがある場合は、ループの内側を @autoreleasepool でラップします。

単一のメソッドを @autoreleasepool でラップすることはあまり一般的ではなく、おそらく多少無意味です。これは、通常、メソッドがループで何度も呼び出された場合にのみ意味のある効果があるためです。@autorelease プールをループに入れると、意図がより明確になります。

于 2012-11-27T17:51:41.943 に答える
1

そこには多くの「場合による」ことが起こっていると思います。

明らかなことから始めて、自動解放されたオブジェクトがなければ問題ありません。列挙が終了した後、コードが実行ループに戻っても問題ありません。

これにより、列挙を含むメソッドが一連の初期化を実行するために使用され、その後さらに処理が続行される場合が残ります。そのためには、後でリリースするようにマークされた一時オブジェクトを取り除くことで利益を得ることができます。

于 2012-11-27T17:41:23.353 に答える