Objective c 目标C,NSMutableDictionary引用计数

Objective c 目标C,NSMutableDictionary引用计数,objective-c,nsmutabledictionary,Objective C,Nsmutabledictionary,我不确定这段代码是否有效…我应该用这样的代码来代替这个吗 NSMutableDictionary *attrs = [nodeAttributes objectForKey:UUID];//nodeAttributes is NSMutalbleDictionary if (attrs == nil) { attrs = [[NSMutableDictionary alloc] init]; [nodeAttributes setObject:

我不确定这段代码是否有效…我应该用这样的代码来代替这个吗

    NSMutableDictionary *attrs = [nodeAttributes objectForKey:UUID];//nodeAttributes is NSMutalbleDictionary
    if (attrs == nil) {
         attrs = [[NSMutableDictionary alloc] init];
         [nodeAttributes setObject:attrs forKey:UUID];
         [attrs release];
    }

我不确定setObject方法是否会增加引用计数…

在第一种情况下,保留计数将增加。这是正确的方法。

setObject将发送一条保留消息,因此您无需这样做。

对象负责声明其拥有的物品的所有权。所以是的,
setObject:forKey:
将保留。苹果公司对此进行了详细解释(但仍然非常简短)。

NSMutableDictionary的
setObject
将保留该对象(这是),因此第一位代码是正确的,第二位代码是泄漏的。就风格而言,读者可以更清楚地了解以下内容:

    NSMutableDictionary *attrs = [nodeAttributes objectForKey:UUID];//nodeAttributes is NSMutalbleDictionary
    if (attrs == nil) {
         attrs = [[NSMutableDictionary alloc] init];
         [nodeAttributes setObject:[attrs retain] forKey:UUID];
         [attrs release];
    }
虽然内存管理是明智的,但您的方法可能更好,因为它避免(隐式地)使用自动释放

if (attrs == nil) {
     attrs = [NSMutableDictionary dictionary];
     [nodeAttributes setObject:attrs forKey:UUID];
}