0

ドキュメントには、NSAutoreleasePoolのaddObject:メソッドがあります。

私はこれについて考えました:

NSString * myString = [[NSString alloc] initWithCString: "これは機能しますか?"]; [thePool addObject:myString]; [anotherPool addObject:myString];

それは可能ですか?自動解放プールスタックの一番上のオブジェクトにのみオブジェクトを追加できることを常に読んでいます。

4

3 に答える 3

6

はい、できます。しかし、決してすべきではありません。これを行う理由は断固としてありません。

于 2009-04-28T20:13:08.473 に答える
2

あなたがしていることは可能ですが、-release割り当て解除後に myString にメッセージが送信されるため、実行時に例外が発生する可能性があります (最後に残っている参照が最初のプールによるものであると仮定します)。一般に、-[NSAutoreleasePool addObject:] ドキュメントに記載されているように、オブジェクトを自動解放プールに手動で追加するのではなく、-autoreleaseそのオブジェクトを呼び出して追加する必要があります。これにより、現在のスレッドのアクティブな自動解放プールにオブジェクトが配置されます (各スレッドには独自の自動解放プールがあります)。

于 2009-04-28T20:07:05.260 に答える
-2

Appleからの次の理由により、私は今少し混乱しています。

オブジェクトが自動解放されたとき、つまり、オブジェクトに自動解放メッセージが送信されたとき、または addObject: クラス メソッドに引数として渡されたとき、オブジェクトは常にスタックの一番上にある自動解放プールに置かれます。

一方、NSAutoreleasePool クラス リファレンスでは言及されていません。そのため、特定のオブジェクトで addObject: を呼び出しても、自動解放プール スタックの一番上にあるオブジェクトに移動すると思います。実際、私はそれを試してみる必要があります;)

于 2009-04-29T08:05:12.477 に答える