69

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

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

4

1 に答える 1

97

このステートメントは、 NSAutoreleasePoolクラス@autoreleasepoolを使用する代わりに、以前と同じ仕事をしています。NSAutoreleasePool が機能する方法は少し奇妙でした。これを作成すると、アプリケーション全体に影響が及ぶからです。範囲指定された領域を作成し、プール内に何があり、いつ排出されるか (範囲外になる場合) を明確にします。また、Apple によれば、より効率的です。@autoreleasepool

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

ARC ではautorelease、開発者はメソッドを使用しませんが、ARC を管理する基盤となるシステムがそれを挿入します。(覚えておいてください: ARC が行っているのは を挿入することだけretainであり、適切なタイミングであなたreleaseautorelease呼び出します)。このため、既存の AutoreleasePool の概念を維持する必要があります。

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

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

于 2013-02-03T20:58:16.763 に答える