Class

NSAutoreleasePool

An object that supports Cocoa’s reference-counted memory management system. あるオブジェクト、それはCocoaのもつ参照カウントメモリ管理システムをサポートします。

Declaration 宣言

@interface NSAutoreleasePool : NSObject

Overview 概要

An autorelease pool stores objects that are sent a release message when the pool itself is drained. オートリリースプールは、幾らかのオブジェクトを格納し、それらはreleaseメッセージをそのプール自身が空にされる時に送信されます。

In a reference-counted environment (as opposed to one which uses garbage collection), an NSAutoreleasePool 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. ある参照カウント環境において(ガベージコレクションを使うものとは対照的に)、NSAutoreleasePoolオブジェクトはautoreleaseメッセージを受け取ったオブジェクトを含みます、そしてそれがすっかり空になった時にreleaseメッセージをそれらオブジェクト各々に送ります。したがって、autoreleasereleaseの代わりにオブジェクトに送ることは、そのオブジェクトの寿命を少なくともプールそれ自体が空にされるまで伸ばします(それは長いかもしれません、もしそのオブジェクトがその後にリテイン(保有)されるならば)。あるオブジェクトは、同じプールに何度か入れられることができます、その場合にそれは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 NSAutoreleasePool 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. あなたは、NSAutoreleasePoolオブジェクトを通常のallocinitメッセージで作成して、それをdrainで処分します(またはrelease— 違いを理解するために、Garbage Collectionを見てください)。あなたはオートリリースプールをリテイン(保有)する(またはそれをオートリリースする—retainautoreleaseを見てください)ことができないことから、あるプールを空にすることは最終的にはそれをデアロケートする効果があります。あなたは、常にオートリリースプールをそれが作成されたのと同じ文脈(メソッドまたは関数の発動、またはループの本文)において空にすべきです。Using Autorelease Pool Blocksをさらなる詳細として見てください。

Each thread (including the main thread) maintains its own stack of NSAutoreleasePool 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. 各スレッドは(メインスレッドを含めて)NSAutoreleasePoolオブジェクトそれらからなるそれ自身のスタックを保守します(Threadsを見てください)。新しいプールそれらが作成されるにつれて、それらはスタックの一番上に加えられます。プールそれらがデアロケートされる時、それらはスタックから取り除かれます。オートリリースされたオブジェクトは、現在のスレッドに対する一番上のオートリリースプールに置かれます。スレッドが終了する時、それは自動的にそれ自身と結び付けられたオートリリースプールの全てを空にします。

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呼び出しをしないならば、あなたはオートリリースプールを作成する必要はありません。

Garbage Collection ガベージコレクション

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と同じ効果があります。概して、その結果、あなたはdrainreleaseの代わりに使うべきです。

Topics 話題

Managing a Pool プールを管理する

Adding an Object to a Pool オブジェクトをプールに加える

Debugging デバッグする

Relationships 関係

Inherits From 継承元

See Also 参照

Memory Management メモリ管理