2011-02-13 52 views
0

iOS内存管理仍然是我想要理解的东西,但这也是我最感兴趣的方面,所以我在这里要求我的代码的一些帮助。了解内存管理与NSDictionary版本

我尝试实例化一个对象的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)有什么区别?

非常感谢您对本主题提供的任何帮助。

法布里奇奥

+0

您的代码表明对基于指针的内存管理缺乏了解。请阅读http:// boredzo。组织/指针/指针是什么以及它对你的代码意味着什么。 – 2011-02-14 21:18:25

回答

11

不要叫retainCount

retainCount是用于试图找出内存管理方法可怕。由于实现细节,对象的绝对保留计数很少有趣,并且往往会令人深不可测。

Read the documentation。这非常简单。

现在,到你的代码。

  • 不需要在第一行的分配/初始化分配commentDictionary和对象将是在for()循环的第一行分配被泄露。

  • ,而不是使用(;;),你可以使用for(commentDictionary in jsonArray) {...}

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

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


哦,什么西里尔说。静态分析器是一个奇妙的工具!

+1

@Fabrizio:我认为你误解了一件事是你不用`alloc`和`init`创建变量。你通过声明来创建变量;这就是'NSDictionary * commentDictionary [`];`做的。你用`alloc`和`init`创建* objects *,你创建的每个对象,你必须释放(如doc @bbum链接到的那样;读整个东西)。在你创建一个字典之后,你用一个指向另一个字典的指针替换你的指针,该指针由`objectAtIndex:`返回。因此,你泄漏了你创建的字典,而你的`发行版'会转到你没有的字典中。 – 2011-02-14 21:01:59

+0

bbum - 您能否更新您的答案以修复“阅读文档”链接?在此先感谢... – 2013-12-19 19:15:49

2

我建议你在该代码上运行静态分析器:我在内存管理上做了很多错误,按照蓝色小箭头 所描述的步骤进行解释。

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

PS:retainCount往往是错的;