1

ARC環境で次のコードでメモリを正しく処理していることを誰かに教えてもらえますか?私の懸念は、ARCでrelease / autoreleaseを使用できない場合、どのようにオブジェクトが解放されるかを決定することです。強いタイプかどうかはわかりますが、新しいタイプを作成する前にリリースされますが、次の外観では、どのように機能するかわかりません。

NSMutableArray *questions = [[NSMutableArray alloc] init];

for (NSDictionary *q in [delegate questions]) 
{
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
    [dict setValue:[q objectForKey:@"text"] forKey:@"text"];
    [dict setValue:nil forKey:@"value"];
    [dict setValue:[NSString stringWithFormat:@"%d",tag] forKey:@"tag"];
    [questions addObject:dict];
    dict = nil;
 }
4

1 に答える 1

7

はい、あなたはあなたをdict正しく扱っています。

次のようなスニペットがある場合:

{
    id __strong foo = [[NSObject alloc] init];
}

変数のスコープを離れるobjと、所有している参照は解放されます。オブジェクトは自動的に解放されます。しかし、それは魔法のようなものではありません。ARCは(内部で)次のような呼び出しを行います。

{ 
    id __strong foo = [[NSObject alloc] init]; //__strong is the default
    objc_release(foo); 
}

objc_release(...)一種のrelease呼び出しですが、objcメッセージングをバイパスするため、非常にパフォーマンスが高くなります。

dictさらに、変数をに設定する必要はありませんnil。ARCがこれを処理します。nilオブジェクトへの参照が消えるようにオブジェクトを設定します。オブジェクトへの強い参照がない場合、オブジェクトは解放されます(魔法は関係なく、コンパイラーはそれを実現するために適切な呼び出しを行います)。この概念を理解するために、2つのオブジェクトを想定します。

{
    id __strong foo1 = [[NSObject alloc] init];
    id __strong foo2 = nil;

    foo2 = foo1; // foo1 and foo2 have strong reference to that object

    foo1 = nil; // a strong reference to that object disappears

    foo2 = nil; // a strong reference to that object disappears

    // the object is released since no one has a reference to it
}

ARCがどのように機能するかを理解するには、MikeAshブログを読むことをお勧めします。

お役に立てば幸いです。

于 2012-07-11T14:59:52.137 に答える