【问题标题】:instruments showing NSPlaceholderstring leaks显示 NSPlaceholderstring 泄漏的仪器
【发布时间】:2011-05-31 05:42:30
【问题描述】:

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

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;

我尝试了所有我能想到的:

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

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

有什么想法吗?

【问题讨论】:

    标签: iphone memory-leaks instruments


    【解决方案1】:

    你在哪里发布storedHash?你是在dealloc发布的吗?

    注意NSPlaceholdeString 是一个实现细节;是NSString+alloc方法返回的实例的类。

    【讨论】:

    • dealloc方法中释放he self.storedHash问题解决了吗?
    【解决方案2】:

    dealloc 方法中怎么样?你有没有在dealloc方法中释放storedHash?以及如何检查if (nil == self.storedHash)

    【讨论】:

    • self.storedHashstoredHash 在这种情况下无关。
    【解决方案3】:

    你应该使用

    @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。

    【讨论】:

      猜你喜欢
      • 2012-05-07
      • 2014-04-03
      • 2011-03-05
      • 2011-11-02
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 2011-07-11
      相关资源
      最近更新 更多