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
答案 0 :(得分:11)
retainCount
是一种可怕的方法,用于试图找出内存管理。对象的绝对保留计数很少有趣,并且由于实现细节,通常是不可思议的。
Read the documentation。这很简单。
现在,到您的代码。
不需要第一行中{/ 1}}的alloc / init赋值,并且该对象将泄漏到commentDictionary
循环中第一行的赋值。
而不是使用for(;;),您可以使用for()
没有理由在该代码中保留或释放for(commentDictionary in jsonArray) {...}
;从数组中检索的对象将在该方法的整个范围内保持有效。
Objective-C是一种“零消息”语言。当您在commentDictionary
上调用某个方法时,该调用几乎在所有情况下都会返回0.
哦,西里尔说的话。静态分析仪是一个很棒的工具!
答案 1 :(得分:2)
我建议你在那段代码上运行静态分析器:关于内存管理的许多错误都是通过遵循小蓝箭头的步骤来解释的 描述。
这是一个非常有用/酷/宽容的工具,可以发现自己的错误并了解正在发生的事情。在构建菜单中构建和分析。
PS:retainCount经常出错;