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