发布Quickie

时间:2010-04-22 22:57:06

标签: objective-c cocoa cocoa-touch release retain

如何简洁地处理这种情况。我没有在contactDictionary声明中正确发布if ...

    NSNumber *pIDAsNumber;
     ...        
    NSMutableDictionary *contactDictionary = [NSMutableDictionary dictionaryWithDictionary:[defaults dictionaryForKey:kContactDictionary]];
    if (!contactDictionary) {
            contactDictionary = [[NSMutableDictionary alloc] initWithCapacity:1];
    }
    [contactDictionary setObject:pIDAsNumber forKey:[myClass.personIDAsNumber stringValue]];
    [defaults setObject:contactDictionary forKey:kContactDictionary];

2 个答案:

答案 0 :(得分:3)

通常,使用[NSMutableDictionary dictionaryWithCapacity:1]而不是alloc / init。这将为您提供一个自动释放的字典,从内存管理的角度来看,它将与上面的字典完全相同。然而...

在这种特定情况下,你的if子句永远不会成立(除非你内存不足,在这种情况下你会遇到更大的问题)。如果传递的是-dictionaryWithDictionary:,则返回一个空字典而不是nil。因此,即使-dictionaryForKey:返回nil,-dictionaryWithDictionary:仍会创建一个空的可变字典供您添加。

答案 1 :(得分:0)

您可以完全删除if语句,因为-[NSMutableDictionary dictionaryWithDictionary:]始终会返回字典。

另外,不要使用[NSMutableDictionary dictionaryWithCapacity:1]来获取一个空的,自动释放的可变字典。只需使用[NSMutableDictionary dictionary]