使用NSDictionary版本了解内存管理

时间:2011-02-13 21:45:48

标签: iphone objective-c cocoa nsdictionary

iOS内存管理对我来说仍然是一个奇怪的东西,但这对我来说也是最有趣的方面,所以我在这里要求我的代码提供一些帮助。

我尝试实例化一个NSDictionary对象,我使用它然后我想发布但是我得到了一个对象发布错误,这是代码:

if ([jsonArray count] > 0) {        
    NSDictionary *commentDictionary = [[NSDictionary alloc]init];
    int i;
    for (i = 0; i < [jsonArray count]; i++) {
        commentDictionary = [jsonArray objectAtIndex:i];
        NSLog(@"debugging message here"]);
        commentLabel.text = [commentDictionary objectForKey:@"commentText"];
        //[commentDictionary retain];
    }
    //[commentDictionary release];
    commentDictionary = nil;
    NSLog(@"NSDictionary retainCount = %d",[commentDictionary retainCount]);
}

没什么特别的,我从一个数组中填写一个字典,在我的代码中你可以看到我试图发布但是因为错误而没有注释掉。 为什么我不能发布字典?

除了设置NSDictionary与nil之间的区别是什么在retainCount和release中返回零(应该使计数为-1)?

我非常感谢你提前为这个主题提供任何帮助。

的Fabrizio

2 个答案:

答案 0 :(得分:11)

不要调用retainCount

retainCount是一种可怕的方法,用于试图找出内存管理。对象的绝对保留计数很少有趣,并且由于实现细节,通常是不可思议的。

Read the documentation。这很简单。

现在,到您的代码。

  • 不需要第一行中{/ 1}}的alloc / init赋值,并且该对象将泄漏到commentDictionary循环中第一行的赋值。

  • 而不是使用for(;;),您可以使用for()

  • 没有理由在该代码中保留或释放for(commentDictionary in jsonArray) {...};从数组中检索的对象将在该方法的整个范围内保持有效。

  • Objective-C是一种“零消息”语言。当您在commentDictionary上调用某个方法时,该调用几乎在所有情况下都会返回0.


哦,西里尔说的话。静态分析仪是一个很棒的工具!

答案 1 :(得分:2)

我建议你在那段代码上运行静态分析器:关于内存管理的许多错误都是通过遵循小蓝箭头的步骤来解释的 描述。

这是一个非常有用/酷/宽容的工具,可以发现自己的错误并了解正在发生的事情。在构建菜单中构建和分析。

PS:retainCount经常出错;