3

メソッドを呼び出すたびにautorelease、そのオブジェクトはNSAutoreleasePool. プールがドレインされると、プール内のすべてのオブジェクトにリリースが送信されます。

私の質問は;
メイン関数には が 1 つありNSAutoreleasePoolます。私はそれを知りたいです。メソッドを呼び出すとautorelease、オブジェクトはどこに送信されますか? つまり; NSAutoreleasePoolメイン関数(または)のどこかにあるオブジェクトを送信していますか?

前もって感謝します。

4

1 に答える 1

8

実際には、自動解放プールのスタックがあります。これを行うたびに[[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を構築しましょう」を参照してください

于 2011-09-02T16:49:00.157 に答える