【问题标题】:Why does this line leak memory?为什么这条线会泄漏内存?
【发布时间】:2011-12-19 02:56:31
【问题描述】:
[row setObject:[NSString stringWithCString:value encoding:NSUTF8StringEncoding] forKey:columnName];

其中 row 是 NSMutableDictionary.. 有没有其他方法可以将此字符串注入我的字典中?

【问题讨论】:

  • 谁告诉你内存泄漏的?
  • 我正在使用我的分析工具,它显示那里存在泄漏。

标签: iphone objective-c memory-management


【解决方案1】:

分析工具说因为字符串是“自动释放的”,所以你可以优化它

  • 在其周围放置一个 NSAutoreleasePool
  • alloc/init str 然后释放它
  • 或者直接忽略优化消息。

这是一种方式:

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

【讨论】:

  • 您提供的代码不会以具有完全相同的保留计数的 NSString 对象结束吗?
  • 视情况而定,您的代码中的自动释放字符串在遇到自动释放池耗尽/释放以及满足警告标准的分析工具之前不会被释放。当您手动发布它时,它在您发布时是免费的,并且工具认为这是标准的编码方式,但差异是如此微不足道,以至于最终真的无关紧要。你的代码写起来、读起来都快得多,而且看起来更干净,所以我会按照你个人的方式保留它。
【解决方案2】:

我以前也遇到过这个问题,因为NSMutableDictionary 拥有对象,它在字典发布之前不会被释放。

我建议在您的代码中的某个地方,一个对象在没有正确释放它拥有的变量的情况下被释放,可能是NSMutableDictionary *row

【讨论】:

  • 所以如果我有一个包含多个对象的自定义类,是否最好先释放该自定义类中的每个活动对象,然后再释放父对象?
  • 在你分配/初始化/复制一个对象的每个类中,该类应该负责在释放期间释放这些对象。我和你做的一模一样,分析器告诉我代码泄露了。我的问题是我没有正确释放父对象,所以它下面的所有东西都没有被释放。
  • 当然,除非您在 SDK5.0 中使用 ARC(自动引用计数),否则您应该没有问题。
  • 感谢您的提示,我正在使用 ios4,所以我将不得不通过并从我的自定义类中正确释放内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 2010-10-11
  • 2011-10-21
  • 2021-08-15
相关资源
最近更新 更多