【问题标题】:Release Quickie释放快速
【发布时间】:2010-04-22 22:57:05
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    通常,使用 [NSMutableDictionary dictionaryWithCapacity:1] 代替 alloc/init。这将为您提供一个自动释放的字典,从内存管理的角度来看,它的行为与上述字典相同。不过……

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

    【讨论】:

    • 是的。相反,您应该使用[[defaults dictionaryForKey:kContactDictionary] mutableCopy]
    • 感谢您提供有关参数为 nil 时的行为的信息 - 它不在文档中!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      • 2015-07-03
      • 1970-01-01
      • 2019-10-11
      • 1970-01-01
      • 2015-06-01
      • 2012-02-15
      相关资源
      最近更新 更多