Advanced Memory Management Programming Guideは、@autoreleasepool について次のように述べています。
ローカル自動解放プール ブロックを使用してピーク メモリ フットプリントを削減する
多くのプログラムは、自動解放される一時オブジェクトを作成します。これらのオブジェクトは、ブロックの最後までプログラムのメモリ フットプリントに追加されます。多くの場合、現在のイベント ループの反復が終了するまで一時オブジェクトを蓄積できるようにしても、過度のオーバーヘッドは発生しません。ただし、場合によっては、大量の一時オブジェクトを作成してメモリ フットプリントを大幅に増やし、より迅速に破棄する必要がある場合があります。後者の場合、独自の autorelease プール ブロックを作成できます。ブロックの最後に、一時オブジェクトが解放されます。これにより、通常は割り当てが解除され、プログラムのメモリ フットプリントが削減されます。
次の例は、for ループでローカル自動解放プール ブロックを使用する方法を示しています。
NSArray *urls = <# An array of file URLs #>;
for (NSURL *url in urls) {
@autoreleasepool {
NSError *error;
NSString *fileContents = [NSString stringWithContentsOfURL:url
encoding:NSUTF8StringEncoding error:&error];
/* Process the string, creating and autoreleasing more objects. */
}
}
このコードは、autoreleasepool を使用せずに記述して効率的に管理することもできますか?
を作成し、処理後にproperty of fileContents
設定するようなものです。nil
self.filecontents = nil;