iOS:ARC环境中的对象发布

时间:2012-07-11 14:11:20

标签: objective-c automatic-ref-counting ios5.1

有人可以告诉我,我在ARC环境中的以下代码中正确处理内存吗?我担心如果我不能在ARC中使用发布/自动释放,dict对象将如何释放!我知道如果它是强类型然后它会在创建新类型之前被释放但是在下面看起来我不知道它会如何工作。

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;
 }

1 个答案:

答案 0 :(得分:6)

是的,您正在正确处理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调用,但由于它通过对象发送消息,因此非常有效。

此外,您无需将变量dict设置为nil。 ARC将为您处理此问题。将对象设置为nil会导致对象的引用消失。当一个对象没有对它的强引用时,该对象被释放(不涉及任何魔法,编译器将进行正确的调用以使其发生)。要理解这个概念,假设你有两个对象:

{
    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的工作方式,我建议您阅读Mike Ash blog

希望有所帮助。