2012-01-03 3 views
1

ループは、私は、このようなコードがあるとします。@autoreleaseと

@autoreleasepool { 
    for(int i = 0; i < relatedSlideDecks.count; i++) { 
    MyClass *myObject = [MyClass new]; 
    ... something happens here 
    [myObject release]; 
    { 
} 

は、私はまだ[myObject release];ことが必要なのですか?または@autoreleasepoolのために自動リリースされますか?

答えて

2

@autoreleasepoolブロックはあなたが所有するオブジェクトの所有権を放棄しなければならない、とあなたはmyObjectを所有状態memory management rulesを、変更されませんので、まだmyObjectを解放するための要件です。あなたができない1つのことは、そのブロックの外側にある@autoreleasepoolブロック内のオートリリースされたオブジェクトを使用することです。メインの自動解放プールがなくなるまでではなく、できるだけ早く解放する必要のある多くの自動解放オブジェクトを作成する可能性がある、プログラムの小さな部分がある場合に便利です。

3

ARCを使用している場合は、ARCを使用している場合は必要ありません。

それ以外の場合は、そのリリースメソッドを呼び出す必要があります。

@autoreleasepoolブロックを確実にする唯一のことは、あなたのコードがそれを過ぎて実行されると、自動解放呼び出しを持つオブジェクトはすべて解放呼び出しを得ることです。

3

はい、まだ[myObject release]が必要です。 @autoreleasepoolが存在していても、オブジェクトが魔法のようにオートリリースされることはありません。 autoreleaseプールが排水されたときに、の自動解放されたオブジェクトがクリーンアップされるだけです。 Advanced Memory Management Programming Guideで詳細を読むことができます。

関連する問題