【发布时间】: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