2013-02-03 1 views
45

可能性の重複:
Why use Autorelease pool?オートリリープールとは何ですか?

すべてのObjective-Cの開始ページでは、main関数の宣言の下のデフォルト@autoreleasepool{...}文で開きます。しかし、この声明は実際に何をしていますか?新しいObjective-Cはオブジェクトを自動的に解放し、行を削除するとプログラムに何も変わりません。このコマンドは本当に必要ですか?

+0

それともhttp://stackoverflow.com/questions/8714875/why-does-xcode-4-2-use-autoreleasepool-in-main-m-instead-of-nsautoreleasepool –

答えて

71

@autoreleasepoolステートメントは、NSAutoreleasePoolクラスを使用する代わりに、以前と同じジョブを実行しています。 NSAutoreleasePoolが動作する方法は、それを作成するとアプリケーション全体に影響を及ぼしたので、ちょっと変わったものでした。 @autoreleasepoolはスコープされた領域を作成し、プール内のものと排水時(範囲外になったとき)を明確にします。アップルによれば、これはさらに効率的です。

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

ARCを使用すると、開発者はautoreleaseキーワードを使用しませんが、ARCを管理する基盤となるシステムによってARCが挿入されます。 (覚えていること: ARCが行っているのは、retainreleaseautoreleaseが適切なタイミングであなたに呼び出されていることです)。このため、既存のAutoreleasePoolのコンセプトはそのまま残す必要があります。あなたが自動解放プールを削除する場合は、あなたのオブジェクトが参照カウント環境では

漏れるのを開始します

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

+0

これがあればということを意味してい私はARCを使用し、 '' @autoreleasepool {} 'の外側のオブジェクトを解放します。オブジェクトは@autoreleasepoolブロックの終わりまで存在しますか? – confile

+2

自動解放されたオブジェクトを手動で解放すると、自動解放プールの最後に到達すると、deallocされたオブジェクトは存在しなくなり、フレームワークやマシンコードのどこかの例外が発生します。それはコードの長い道のりである場合、あなたのアプリは混乱を引き起こして一見無関係な場所でクラッシュするように見えるかもしれません。 – jcpennypincher

関連する問題