【问题标题】:NSString Copy Memory LeakNSString 复制内存泄漏
【发布时间】:2011-07-31 23:17:42
【问题描述】:

我有一个利用 TouchJSON Objective-C 库的应用程序,我正在运行 Instruments 分析器以检测内存泄漏,并在该源中发现了一个我无法弄清楚如何修复的泄漏。我应该提一下,我对 Cocoa 和 Objective-C 还很陌生。 Instruments 显示泄漏发生在具有以下签名的方法中:

- (BOOL)scanJSONStringConstant:(NSString **)outStringConstant error:(NSError **)outError

...并且泄漏具体发生在此代码块中:

if (self.options & kJSONScannerOptions_MutableLeaves)
{
     *outStringConstant = [theString autorelease];
}
else
{
    *outStringConstant = [[theString copy] autorelease];   //LEAK IS HAPPENING HERE
    [theString release];
}

我尝试了多种修复方法来尝试消除泄漏,但均未成功。有人可以教育我吗:

1) 为什么这是泄漏

...和...

2) 如何修复它

我熟悉 Objective-C 内存管理的基本原理(“如果你分配、复制或新建......释放取决于你”),所以我不需要完整的基础知识 - 只需关于为什么会泄漏的一些见解。

提前感谢您的帮助。

编辑:附加调试信息的图像。

【问题讨论】:

  • 在此代码块之前,outStringConstant 的保留计数是多少?
  • 我做了一个 NSLog(@"%@", [*outStringConstant retainCount]);并在控制台中获取 (null)。这是否与 outStringConstant 被定义为 (NSString **) 而不是 (NSString *) 的事实有关?
  • 您根本不应该查看retainCount。充其量是误导。 (您需要将 %d 用于整数,但话又说回来 - 不要!)

标签: objective-c cocoa xcode memory-leaks instruments


【解决方案1】:

Instruments 告诉您的不是泄漏发生在该行,而是告诉您在该行创建的对象已泄漏。

我将再次查看使用 scanJSONStringConstant 方法的客户端代码并查看其内存管理。是否存在可能错过对 outStringConstant 指针的释放调用的逻辑流程?

【讨论】:

    【解决方案2】:

    更改此行*outStringConstant = [[theString copy] autorelease];

    if(*outStringConstant)
       [*outStringConstant release];
    
    *outStringConstant = [NSString stringWithString:theString];
    [theString release];
    

    【讨论】:

      猜你喜欢
      • 2011-10-31
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 2014-06-06
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 1970-01-01
      相关资源
      最近更新 更多