25

のドキュメントに+[NSThread detachNewThreadSelector:toTarget:withObject:]は次のように書かれています:

ガベージ コレクションされていないアプリケーションの場合、このメソッドaSelectorは、新しく切り離されたスレッド用の自動解放プールを設定し、終了する前にそのプールを解放します。

私の質問は、メソッドNSAutoreleasePoolのオーバーライドで独自のものを作成する必要がありますか、それとも作成はによって処理されますか?-[NSOperation main]NSAutoreleasePoolNSOperation

4

5 に答える 5

14

良い質問です。Apple自身のドキュメントやサンプルコードでさえ、これについてはあまり明確ではありません。私は答えを見つけたと思います:

操作はObjective-Cオブジェクトであるため、タスクコードの実装の早い段階で常に自動解放プールを作成する必要があります。自動解放プールは、タスクの実行中に自動解放されるObjective-Cオブジェクトのリークに対する保護を提供します。カスタムコードが実行されるまでにすでにプールが設定されている可能性がありますが、その動作に依存することはなく、常に独自の動作を提供する必要があります。

基本的に、Davidが述べたようにプールが設置されている場合でも、独自のプールを作成する必要があります。

于 2010-02-04T22:06:17.110 に答える
12

そうです。NSOperationQueue が「何らかの」スレッドで実行される自己完結型の作業を定義しているため、その作業のメモリを管理する責任があります。

于 2008-10-08T20:01:19.163 に答える
6

メインに独自の NSAutoreleasePool を作成する必要はありません。システムが作成します。これを確認するには、Xcode メニュー コマンドの [実行] > [表示] > [ブレークポイント] を使用して [ブレークポイント] ウィンドウを開き、次のように入力します。

プログラムを実行すると、NSOperation 内に自動解放プールが作成されていることがわかります。

独自の自動解放プールを作成しないApple の例 ( http://developer.apple.com/Cocoa/managingconcurrency.htmlなど) も参照してください。

于 2008-12-01T23:13:25.873 に答える
2

はい、メソッドで を作成する必要がありNSAutoreleasePoolます[NSOperation main]。ただし、「並行」(やや残念な命名法)NSOperationサブクラスを作成しており、オーバーライドされ[NSOperation start]たメソッドがNSAutoreleasePool`[NSOperation main] を呼び出す前に を作成している場合を除きます。

クラスのドキュメントには、これらNSOperationすべての詳細な説明があります: http://developer.apple.com/documentation/Cocoa/Reference/NSOperation_class/Reference/Reference.html

于 2008-10-09T04:39:17.713 に答える
0

はい、する必要があります。

- (void) main
{
  NSAutoreleasePool *thePool = [[NSAutoreleasePool alloc] init];
  //your code here
  //more code
  [thePool release];
}

自動解放プールを作成しない場合、これらの初期化子が自動解放されたオブジェクトを返すため、便利なクラス初期化子([NSString stringWithFormat:]など)がリークします。

于 2009-10-22T09:55:43.030 に答える