2010-04-22 41 views
0

如何简洁地处理这种情况。在if声明,我无法正常释放contactDictionary ...Release Quickie

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

回答

3

通常情况下,使用[NSMutableDictionary dictionaryWithCapacity:1]而不是分配/初始化。这会给你一个自动释放的字典,从内存管理的角度来看,它的行为与上面的一样。然而...

在这个特定的情况下,你的if子句永远不会是真的(除非你内存不足,在这种情况下你有更大的问题)。 -dictionaryWithDictionary:返回空字典,而不是零,如果它通过零。所以,即使-dictionaryForKey:返回零,-dictionaryWithDictionary:仍然会创建一个空的可变字典供您添加。

+1

是的。相反,你应该使用'[[defaults dictionaryForKey:kContactDictionary] mutableCopy]'。 – 2010-04-22 23:46:52

+1

感谢参数为零时的行为信息 - 它不在文档中! – 2012-03-06 02:28:33

0

您可以完全删除if语句,因为-[NSMutableDictionary dictionaryWithDictionary:]总是返回一个字典。

此外,不要使用[NSMutableDictionary dictionaryWithCapacity:1]来获得一个空的,自动发布的可变字典。只需使用[NSMutableDictionary dictionary]