显示NSPlaceholderstring泄漏的工具

时间:2010-12-27 17:14:37

标签: iphone memory-leaks instruments

我正在尝试减少应用中的内存泄漏,因此我使用仪器查找所有泄漏。我设法删除了几乎所有的泄漏,除了一个非常讨厌的泄漏。

乐器告诉我,我有很多NSPlaceholderstring泄漏。 产生泄漏的代码(根据工具)是:

if (nil == storedHash) 
{
  NSString *description = [[NSString alloc] initWithFormat:@"1 = %@ 2= %d", uId, service];
  self.storedHash = description; // This line is the leak according to instruments

  [description release];
  description = nil;
}

return storedHash

storedHash定义如下:

@property(copy) NSString* storedHash;

我尝试了我能想到的一切:

  • 我使用了retain而不是copy
  • 我使用了NSString(stringWithFormat)
  • 的自动释放分配
  • 我尝试使用自动释放池包装代码

以上都没有改变泄漏。 (在某些情况下,泄漏的类型会发生变化,但仍然存在泄漏)

想点什么?

3 个答案:

答案 0 :(得分:5)

你在哪里发布storedHash?你是否在dealloc发布了它?

请注意NSPlaceholdeString是一个实现细节;它是NSString的{​​{1}}方法返回的实例的类。

答案 1 :(得分:0)

dealloc方法怎么样?你是否在dealloc方法中释放了storedHash?如何检查if (nil == self.storedHash)

答案 2 :(得分:0)

你应该使用

@property(nonatomic, retain) NSString* storedHash;

而是复制。 @property(copy)没有发布你的旧NSObject,你应该自己做:

if (nil == storedHash) 
{
  NSString *description = [[NSString alloc] initWithFormat:@"1 = %@ 2= %d", uId, service];
  [self.storedHash release];
  self.storedHash = description; // This line is the leak according to instruments

  [description release];
  // description = nil; // it's unnecessary
}

你也应该在dealloc中发布storedHash。