【问题标题】:NSString initWithFormat memory leak stumperNSString initWithFormat 内存泄漏问题
【发布时间】:2011-08-29 15:47:09
【问题描述】:

XCode 暗示 [NSString initWithFormat] 方法(如 Instruments 窗口中所列)是内存泄漏的来源。它列出了特定的方法,因此在该方法中,我用initWithFormat 标识了唯一的代码行(与 Instruments 中标识的一些泄漏不同,由于某种原因,这不会带我到确切的违规代码行):

 NSString * name=[[NSString alloc] initWithFormat:@"%@",[[lineArray objectAtIndex:0] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] ];

 CustomObject * newData=[[CustomObject alloc] init];
 newData.info=name; // info is a retained NSString ivar of CustomObject

 [name release];
 [self.ivar setObject:newData forKey:@"key"];
 [newData release];

initWithFormatrelease 在同一范围内:都出现在 if 语句中。

是否有一些 NSString 方法以某种方式调用 initWithFormat 而在代码中并不明显?比如这些stringByTrimmingcharactersInSet类型的方法?

更新:我在initWithFormatrelease 之间添加了所有代码——此外,即使我将initWithFormat 更改为stringWithFormat,Xcode 也会给我同样的内存泄漏,而不是识别@987654333 @,所以这显然是导致问题的对象。

【问题讨论】:

  • 您发布的这段代码看起来不错,一定有一些中间代码导致了问题。您可能希望扩展您的代码示例,以显示您在分配和释放之间使用 name 变量所做的事情。
  • 谢谢,我已经更新了我的问题。
  • 也许它确实将您带到了确切的违规代码行,但您不认识它?请显示准确的违规行。
  • 它根本没有带我去任何源代码。使用调用树,我可以追踪方法在哪里,我通过将其更改为 stringWithFormat 进一步确认了这一点,这导致调用树将泄漏更改为 stringWithFormat 方法

标签: objective-c xcode


【解决方案1】:

仪器不显示对象泄漏的位置;它显示了被泄露的对象是在哪里创建的。所以可能发生的事情是您没有在其dealloc 方法中释放CustomObject 类的info ivar。要么这样,要么你在其他地方过度保留了该对象。

【讨论】:

  • 啊,谢谢! dealloc 是这里缺少的链接。我只是忘了在那里添加它。干杯。
猜你喜欢
  • 2011-10-31
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
  • 2011-10-05
相关资源
最近更新 更多