release
- drain
autorelease
retain
Availability 有効性
Technology
@interface NSAutoreleasePool : NSObject
An autorelease pool stores objects that are sent a release
message when the pool itself is drained.
オートリリースプールは、幾らかのオブジェクトを格納し、それらはrelease
メッセージをそのプール自身が空にされる時に送信されます。
Important 重要
If you use Automatic Reference Counting (ARC), you cannot use autorelease pools directly. Instead, you use @autoreleasepool
blocks. For example, in place of:
あなたが自動参照カウント(ARC)を使うならば、あなたはオートリリースプールを直接に使うことはできません。代わりに、あなたは@autoreleasepool
ブロックを使います。例えば、以下の代わりに:
you would write: あなたは以下を書くでしょう:
@autoreleasepool
blocks are more efficient than using an instance of NSAutorelease
directly; you can also use them even if you do not use ARC.
@autoreleasepool
ブロックそれらは、NSAutorelease
インスタンスを直接に使うことよりもっと効率的です;あなたはまたそれらを、たとえあなたがARCを使わないとしても使用できます。
In a reference-counted environment (as opposed to one which uses garbage collection), an NSAutorelease
object contains objects that have received an autorelease
message and when drained it sends a release
message to each of those objects. Thus, sending autorelease
instead of release
to an object extends the lifetime of that object at least until the pool itself is drained (it may be longer if the object is subsequently retained). An object can be put into the same pool several times, in which case it receives a release
message for each time it was put into the pool.
ある参照カウント環境において(ガベージコレクションを使うものとは対照的に)、NSAutorelease
オブジェクトはautorelease
メッセージを受け取ったオブジェクトを含みます、そしてそれがすっかり空になった時にrelease
メッセージをそれらオブジェクト各々に送ります。したがって、autorelease
をrelease
の代わりにオブジェクトに送ることは、そのオブジェクトの寿命を少なくともプールそれ自体が空にされるまで伸ばします(それは長いかもしれません、もしそのオブジェクトがその後にリテイン(保有)されるならば)。あるオブジェクトは、同じプールに何度か入れられることができます、その場合にそれはrelease
メッセージを、それがプールに入れられた時ごとに受け取ります。
In a reference counted environment, Cocoa expects there to be an autorelease pool always available. If a pool is not available, autoreleased objects do not get released and you leak memory. In this situation, your program will typically log suitable warning messages. 参照カウント環境において、Cocoaはオートリリースプールがいつも利用可能であることを期待します。プールが利用可能でないならば、オートリリースされたオブジェクトはリリース(解放)されません、そしてあなたはメモリを漏洩します。この場合には、あなたのプログラムは概してふさわしい警告メッセージを記録するでしょう。
The Application Kit creates an autorelease pool on the main thread at the beginning of every cycle of the event loop, and drains it at the end, thereby releasing any autoreleased objects generated while processing an event. If you use the Application Kit, you therefore typically don’t have to create your own pools. If your application creates a lot of temporary autoreleased objects within the event loop, however, it may be beneficial to create “local” autorelease pools to help to minimize the peak memory footprint. Application Kitはオートリリースプールを、メインスレッド上でイベントループのあらゆるサイクル(循環)の始まりで作成します、そしてそれをその終わりで空にします、それによってイベント処理の間に生成されたすべてのオートリリースされるオブジェクトをリリース(解放)しています。あなたがApplication Kitを使うならば、あなたは従って概してあなた独自のプールを作成する必要はありません。あなたのアプリケーションがたくさんの一時的なオートリリースされるオブジェクトをイベントルール内に作成するならば、“ローカルな” オートリリースプールを作成してメモリフットプリントの最大値を最小化する助けとするのは有益かもしれません。
You create an NSAutorelease
object with the usual alloc
and init
messages and dispose of it with drain
(or release—to understand the difference, see Garbage Collection). Since you cannot retain an autorelease pool (or autorelease it—see retain and autorelease), draining a pool ultimately has the effect of deallocating it. You should always drain an autorelease pool in the same context (invocation of a method or function, or body of a loop) that it was created. See Using Autorelease Pool Blocks for more details.
あなたは、NSAutorelease
オブジェクトを通常のalloc
とinit
メッセージで作成して、それをdrain
で処分します(またはrelease— 違いを理解するために、Garbage Collectionを見てください)。あなたはオートリリースプールをリテイン(保有)する(またはそれをオートリリースする—retainとautoreleaseを見てください)ことができないことから、あるプールを空にすることは最終的にはそれをデアロケートする効果があります。あなたは、常にオートリリースプールをそれが作成されたのと同じ文脈(メソッドまたは関数の発動、またはループの本文)において空にすべきです。Using Autorelease Pool Blocksをさらなる詳細として見てください。
Each thread (including the main thread) maintains its own stack of NSAutorelease
objects (see Threads). As new pools are created, they get added to the top of the stack. When pools are deallocated, they are removed from the stack. Autoreleased objects are placed into the top autorelease pool for the current thread. When a thread terminates, it automatically drains all of the autorelease pools associated with itself.
各スレッドは(メインスレッドを含めて)NSAutorelease
オブジェクトそれらからなるそれ自身のスタックを保守します(Threadsを見てください)。新しいプールそれらが作成されるにつれて、それらはスタックの一番上に加えられます。プールそれらがデアロケートされる時、それらはスタックから取り除かれます。オートリリースされたオブジェクトは、現在のスレッドに対する一番上のオートリリースプールに置かれます。スレッドが終了する時、それは自動的にそれ自身と結び付けられたオートリリースプールの全てを空にします。
If you are making Cocoa calls outside of the Application Kit’s main thread—for example if you create a Foundation-only application or if you detach a thread—you need to create your own autorelease pool. あなたがCocoa呼び出しをApplication Kitのメインスレッドの外側からしているならば — 例えばあなたがFoundationのみのアプリケーションを作成するならばまたはあなたがあるスレッドを分離するならば — あなたはあなた独自のオートリリースプールを作成する必要があります。
If your application or thread is long-lived and potentially generates a lot of autoreleased objects, you should periodically drain and create autorelease pools (like the Application Kit does on the main thread); otherwise, autoreleased objects accumulate and your memory footprint grows. If, however, your detached thread does not make Cocoa calls, you do not need to create an autorelease pool. あなたのアプリケーションまたはスレッドが長生きするそして潜在的に多くのオートリリースオブジェクトを生成するならば、あなたは定期的にオートリリースプールを作成およびからにするべきです(Application Kitがメインスレッド上でするように);そうしなければ、オートリリースオブジェクトは蓄積されて、あなたのメモリ専有面積は増大します。しかしながら、あなたの分離スレッドがCocoa呼び出しをしないならば、あなたはオートリリースプールを作成する必要はありません。
Note 注意
If you are creating secondary threads using the POSIX thread APIs instead of NSThread
objects, you cannot use Cocoa, including NSAutorelease
, unless Cocoa is in multithreading mode. Cocoa enters multithreading mode only after detaching its first NSThread
object. To use Cocoa on secondary POSIX threads, your application must first detach at least one NSThread
object, which can immediately exit. You can test whether Cocoa is in multithreading mode with the NSThread
class method is
.
あなたが二次的なスレッドをNSThread
の代わりにPOSIXスレッドAPIを使って作成しているならば、あなたは、NSAutorelease
を含めてCocoaを使うことはできません、Cocoaがマルチスレッドモードにある場合を除いて。Cocoaはマルチスレッドモードに、それの最初のNSThread
オブジェクトを分離する後にのみ入ります。Cocoaを二次的POSIXスレッド上で使うには、あなたのアプリケーションは最初に少なくとも1つのNSThread
オブジェクト、それは直ぐに退出できます、を分離しなければなりません。あなたは、Cocoaがマルチスレッドモードにあるかどうか試験することがNSThread
クラスのメソッドis
で可能です。
In a garbage-collected environment, there is no need for autorelease pools. You may, however, write a framework that is designed to work in both a garbage-collected and reference-counted environment. In this case, you can use autorelease pools to hint to the collector that collection may be appropriate. In a garbage-collected environment, sending a drain
message to a pool triggers garbage collection if necessary; release, however, is a no-op. In a reference-counted environment, drain
has the same effect as release. Typically, therefore, you should use drain
instead of release.
ガベージコレクション環境では、オートリリースプールの必要はありません。あなたは、しかしながら、ガベージコレクションと参照カウント環境の両方で機能するよう設計されるフレームワークを書くかもしれません。この場合には、あなたはオートリリースプールを使って、コレクターにコレクションが適切であるかもしれないことをほのめかすことができます。ガベージコレクション環境において、drain
メッセージをあるプールに送ることはガベージコレクションを引き起こします、もし必要ならば;releaseは、しかしながら、no-op(何もしない命令)です。参照カウント環境において、drain
は、releaseと同じ効果があります。概して、その結果、あなたはdrain
をreleaseの代わりに使うべきです。
release
- drain
autorelease
retain
+ addObject:
- addObject:
+ showPools
stderr
.
現在のスレッドの持つオートリリースプールスタックの状態をstderr
に表示します。