【问题标题】:Understanding Memory management with NSDictionary release了解 NSDictionary 版本的内存管理
【发布时间】:2023-03-29 09:04:01
【问题描述】:

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 中返回零和释放(应该使计数为 -1)之间有什么区别?

非常感谢您在此主题上提供的任何帮助。

法布里齐奥

【问题讨论】:

  • 您的代码表明对基于指针的内存管理缺乏了解。请阅读boredzo.org/pointers,了解指针是什么以及它对您的代码意味着什么。

标签: iphone objective-c cocoa nsdictionary


【解决方案1】:

不要调用retainCount

retainCount 是一种用于尝试找出内存管理的可怕方法。对象的绝对保留计数很少有趣,并且由于实现细节而常常难以理解。

Read the documentation。这很简单。

现在,到你的代码。

  • 不需要在第一行中分配给 commentDictionary 的 alloc/init 分配,并且该对象将在 for() 循环中的第一行分配中泄漏。

    李>
  • 您可以使用for(commentDictionary in jsonArray) {...}

  • ,而不是使用 for(;;)
  • 没有理由在该代码中保留或释放commentDictionary;从数组中检索到的对象将在该方法的整个范围内保持有效。

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


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

【讨论】:

  • @Fabrizio:我认为您误解的一件事是您没有使用allocinit 创建变量。您通过声明变量来创建变量;这就是NSDictionary *commentDictionary[…]; 所做的。您使用allocinit 创建对象,并且您创建的每个对象都必须释放(如链接到的文档@bbum 中所述;阅读全文)。创建字典后,您将指向它的指针替换为指向不同字典的指针,由objectAtIndex: 返回。因此,您泄漏了您创建的字典,并且您的 release 进入了您没有创建的字典。
  • bbum - 您能否更新您的答案以修复“阅读文档”链接?在此先感谢...
【解决方案2】:

我建议您对该代码运行静态分析器:我在内存管理方面犯的很多错误都可以通过遵循蓝色小箭头的步骤来解释 描述。

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

PS:retainCount 经常出错;

【讨论】:

  • 你们都是令人难以置信的,这个话题帮助了很多,thanx这么多。我今天开始使用静态分析器,它很棒。我还开始阅读有关指针的内容并打印了苹果文档。谢谢 Dave、BBum、Peter 和 Cyril。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-31
  • 1970-01-01
相关资源
最近更新 更多