実際には、自動解放プールのスタックがあります。これを行うたびに[[NSAutoreleasePool alloc] init]
、新しく作成されたプールが自動的に自動解放プール スタックの一番上に置かれます。必要なときにいつでも独自のプールを作成できます。
より正確には、各スレッドに自動解放プールのスタックがあります。したがって、スレッドを作成するときはいつでも(たとえば を使用して[foo performSelectorInBackground:@selector(bar) withObject:baz]
)最初に行う必要があるのは、プールを作成することです。そうしないと、オブジェクトがリークします(これにより、「NSAutoreleaseNoPool(): Object 0xd819d0 of class NSCFString autoreleased with no pool in)」のような悪名高いメッセージが作成されます場所 - 漏れているだけです」と、ここ SO で非常によくある質問です)。
を呼び出すautorelease
と、オブジェクトは現在のスレッド (つまり、そのスレッドで最後に作成されたもの) の最上位の自動解放プールに登録されます。メインの実行ループには、実行ループの反復ごとに空になる独自の自動解放プールがあります (AFAIK)。プールからのプールmain.m
は、実行ループの自動解放プールを作成する前に、たとえば Cocoa Touch によって内部的に生成される可能性のあるオブジェクトをキャッチするためにあります。
編集:舞台裏の詳細については、Mike Ashの「NSAutoreleasePoolを構築しましょう」を参照してください