使用NSDictionary版本了解内存管理

Fab*_*zio 0 iphone cocoa objective-c 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]);
}
Run Code Online (Sandbox Code Playgroud)

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

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

我非常感谢你在本主题中给予的任何帮助.

法布里奇奥

bbu*_*bum 11

不要调用retainCount

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

阅读文档.这很简单.

现在,到您的代码.

  • commentDictionary不需要在第一行中的alloc/init赋值,并且该对象将在for()循环中第一行的赋值上泄露.

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

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

  • Objective-C是一种"零消息"语言.当您打开方法时nil,该调用几乎在所有情况下都将返回0.


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