可能性のある複製:
自動解放プールを使用する理由
Objective-Cのすべての開始ページが開き、メイン関数宣言の下にデフォルトの@autoreleasepool{...}
ステートメントが表示されます。しかし、このステートメントは実際に何をしているのでしょうか?新しいObjective-Cは自動的にオブジェクトをリリースし、行を削除してもプログラムには何も変わりません。このコマンドは本当に必要ですか?
@autoreleasepool
ステートメントは、 NSAutoreleasePool クラスを使用する代わりに、以前と同じジョブを実行しています。 NSAutoreleasePoolの動作方法は少し奇妙でした。NSAutoreleasePoolを作成すると、アプリケーション全体に影響が出るためです。 @autoreleasepool
は、スコープされた領域を作成し、プール内の内容とドレイン時(スコープ外になったとき)を明確にします。また、Appleによればより効率的です。
自動解放プールの概念は、オブジェクトインスタンスが自動解放済みとしてマークされている場合はいつでも簡単です(たとえば、NSString* str = [[[NSString alloc] initWithString:@"hello"] autorelease];
)、その時点で保持カウントは+1になりますが、実行ループの終わりにプールが空になり、自動解放とマークされたオブジェクトの保持カウントは減少します。これは、オブジェクトを保持する方法を準備する間、オブジェクトを保持する方法です。
ARCでは、開発者はautorelease
キーワードを使用しませんが、ARCを管理する基盤システムがそれを挿入します。 (注意:ARCは、retain
、release
、およびautorelease
の呼び出しを適切なタイミングで挿入します)。このため、既存のAutoreleasePoolコンセプトは維持する必要があります。
自動解放プールを削除すると、オブジェクトがリークし始めます
参照カウント環境では、Cocoaは常に使用可能な自動解放プールがあることを期待しています。プールが利用できない場合、自動解放されたオブジェクトは解放されず、メモリがリークします。この状況では、プログラムは通常、適切な警告メッセージを記録します。