web-dev-qa-db-ja.com

自動リリースプールとは何ですか?

可能性のある複製:
自動解放プールを使用する理由

Objective-Cのすべての開始ページが開き、メイン関数宣言の下にデフォルトの@autoreleasepool{...}ステートメントが表示されます。しかし、このステートメントは実際に何をしているのでしょうか?新しいObjective-Cは自動的にオブジェクトをリリースし、行を削除してもプログラムには何も変わりません。このコマンドは本当に必要ですか?

57
moray95

@autoreleasepoolステートメントは、 NSAutoreleasePool クラスを使用する代わりに、以前と同じジョブを実行しています。 NSAutoreleasePoolの動作方法は少し奇妙でした。NSAutoreleasePoolを作成すると、アプリケーション全体に影響が出るためです。 @autoreleasepoolは、スコープされた領域を作成し、プール内の内容とドレイン時(スコープ外になったとき)を明確にします。また、Appleによればより効率的です。

自動解放プールの概念は、オブジェクトインスタンスが自動解放済みとしてマークされている場合はいつでも簡単です(たとえば、NSString* str = [[[NSString alloc] initWithString:@"hello"] autorelease];)、その時点で保持カウントは+1になりますが、実行ループの終わりにプールが空になり、自動解放とマークされたオブジェクトの保持カウントは減少します。これは、オブジェクトを保持する方法を準備する間、オブジェクトを保持する方法です。

ARCでは、開発者はautoreleaseキーワードを使用しませんが、ARCを管理する基盤システムがそれを挿入します。 (注意:ARCは、retainrelease、およびautoreleaseの呼び出しを適切なタイミングで挿入します)。このため、既存のAutoreleasePoolコンセプトは維持する必要があります。

自動解放プールを削除すると、オブジェクトがリークし始めます

参照カウント環境では、Cocoaは常に使用可能な自動解放プールがあることを期待しています。プールが利用できない場合、自動解放されたオブジェクトは解放されず、メモリがリークします。この状況では、プログラムは通常、適切な警告メッセージを記録します。

80
WDUK