【问题标题】:Why I'm getting this memory leak为什么我得到这个内存泄漏
【发布时间】:2012-02-20 09:46:13
【问题描述】:

我在这一行遇到了仪器的内存泄漏:

NSString * finalString;
finalString = [NSString stringWithFormat:@"%@",chunksString];

chunksString 被声明为类字段 NSString。

在其他方法中初始化为:

chunksString =  [NSString stringWithString:@""];

在其他方法中取值:

chunksString = [NSString stringWithFormat:@"%@%@",chunksString,string];

Instruments 在填充 finalString 的行中显示 100% 的泄漏。

据我了解,chunksString 从未使用 alloc、copy 或 init 初始化,与 finalString 相同。两者都不是带有保留的属性,为什么我会有这个泄漏?

谢谢。

【问题讨论】:

  • 据我所知,是 finalString 泄漏了分配给它的新 NSString。你会在后面的代码中发布它吗?
  • @Joachim - 工厂方法如何创建泄漏? [NSString stringWithFormat:@"%@",chunksString];
  • 当您说“chunkString 被声明为类字段 NSString”时,您到底是什么意思?是财产吗?在这种情况下,字符串应该用复制声明而不是保留,用 self.chunkString 和分配给 nil 的 dealloc 寻址。你这样做吗?
  • 声明 NSString * finalString = nil 时赋值为 nil;
  • 你在使用自动释放池吗? stringWithFormat 会在自动释放池中注册该字符串(如果存在),因此如果有,我无法仅从那行代码中看到警告的原因。

标签: objective-c ios nsstring instruments memory-leaks


【解决方案1】:

泄漏初始内存分配在以下行:

finalString = [NSString stringWithFormat:@"%@",chunksString];

泄漏是因为在finalString 的生命周期中,存在与释放不平衡的保留。您需要查看finalString 的整个生命周期。

如果您需要查看对象的保留、释放和自动释放发生的位置,请使用工具:

在仪器中运行,在分配中将“记录引用计数”设置为开启(您必须停止记录才能设置选项)。导致问题代码运行,停止记录,搜索感兴趣的 ivar,向下钻取,您将能够看到所有保留、释放和自动释放发生的位置。

更好的是,尽可能使用 ARC,如果存在无法移植到 ARC 的遗留代码,可以为单个文件关闭它。

【讨论】:

  • 你认为分析器会发现这个泄漏吗?
  • 我已经完成了 Instruments。并且 finalString var 是在使用相同的方法中声明的。不会出现在其他功能中。仅在声明的方法中使用。
  • 加一个用于使用 ARC。开发人员几乎没有理由仍然尝试手动管理对象分配。
  • ARC 支持 iOS 4.x 及更高版本。 iOS 5 中只有一个组件是弱引用归零,只是不要使用该新功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-04
  • 2016-08-03
  • 2011-01-12
  • 2012-05-02
相关资源
最近更新 更多