2011-10-31 54 views
-1
[row setObject:[NSString stringWithCString:value encoding:NSUTF8StringEncoding] forKey:columnName]; 

其中row是一个NSMutableDictionary ..有没有不同的方式将此字符串注入我的字典?这条线为什么会泄漏内存?

+2

谁告诉你泄漏内存? – chown

+0

我正在使用我的分析工具,它显示那里有泄漏。 – box86rowh

回答

0

我以前曾经有过这个问题,因为NSMutableDictionary拥有它不会被释放,直到字典被释放的对象。

我会建议你的代码中的某个对象正在释放它没有正确释放它拥有的变量,可能是NSMutableDictionary *row dealloc'd。

+0

所以如果我有一个包含多个对象的自定义类,是释放该自定义类中的每个活动对象的更好形式,然后释放父对象? – box86rowh

+0

在你分配/ init/copy一个对象的每个类中,该类应该负责在dealloc期间释放这些对象。我有和你一样的事情,Profiler告诉我这个代码泄露了。我的问题是我没有正确地释放一个父对象,所以它下面的所有东西都不会被释放。 – Littlejon

+0

除非你使用SDK5.0的ARC(自动引用计数),否则你应该没有问题。 – Littlejon

1

,分析工具的说,因为字符串为“自动释放”,所以你可以通过

  • 把一个NSAutoreleasePool围绕它进行优化
  • 分配/初始化那么STR释放
  • 或只是忽略优化消息。

这是一种方式:

NSString *str = [[NSString alloc] initWithCString:value encoding:NSUTF8StringEncoding]; 
[row setObject:str forKey:columnName]; 
[str release]; 
+0

你提供的代码是不是最终与NSString对象具有完全相同的保留计数? – Littlejon

+0

这取决于您的代码中的自动发布的字符串将不会获得free'd,直到它遇到autorelease pool drain/release,并且符合警告标准的分析工具。当你手动发布它时,它在发布时是免费的,这些工具认为它是标准的编码方式,但差异是微不足道的,以至于它最终确实无关紧要。你的代码写得更快,阅读和看起来更干净,所以我会保持它的个人风格。 – chown