【问题标题】:XCode 4 + Instruments 4: False positive leaks?XCode 4 + Instruments 4:误报泄漏?
【发布时间】:2011-07-21 23:39:22
【问题描述】:

自从切换到 XCode 4 以来,泄漏工具显示大量泄漏,全部来自 JSONKit 和 ASIHTTPRequest,运行 2 分钟后,我泄漏了数百个数组/字典/字符串(来自 jk_create_dictionary、jk_parse_array、HTTPMessage::*、等)总计几百 KB。大多数堆栈跟踪都不是源自我的任何调用,其余的完全是无辜的。 我很肯定 XCode 4 之前的情况并非如此。 我不知道罪魁祸首是谁。任何见解都会很可爱。

更新:
JSONKit 泄漏可能是 JSONDecoder 缓存。
例如:

static JSONDecoder *decoder = nil;
if (!decoder) 
    decoder=[[JSONDecoder alloc] init];

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:url]];
[request setCachePolicy:ASIDoNotWriteToCacheCachePolicy];
[request setCompletionBlock:^{
    NSData *response = [request responseData];
    NSDictionary *json = [decoder objectWithUTF8String:[response bytes] length:[response length]];
    // ...
}];
[request setFailedBlock:^{
    // ...
}];

[request startAsynchronous];

【问题讨论】:

  • 得到了使用 JSONKit 的泄漏报告......正在调查。
  • JSONKit 完美运行,在您的情况下,是您的代码 (我猜可能使用块) 导致内存泄漏。也许您应该编辑您的问题或接受答案以关闭此问题。

标签: objective-c xcode instruments asihttprequest


【解决方案1】:

编辑: 在您阅读此答案的其余部分之前:

如果您看到这种内存泄漏,请不要责怪 Instruments 或 JSONKit... 两者都是可靠的!

...你自己,99.9% 的可能性你的代码泄露了你用@解析的数据987654325@!

END_OF_EDIT


不是一个答案,而是一个补充,并试图了解发生了什么,因为我也看到仪器泄漏。

我就是这样使用 JSONKit 的:

NSArray *lines = [dataString componentsSeparatedByString:@"\n"];
for (NSString *line in lines) { // I know, strange format isn't? :)
  NSDictionary *json = [line objectFromJSONStringWithParseOptions:JKParseOptionLooseUnicode];
  // use dictionary data...
}

@ssteinberg,您遇到的是这种泄漏吗? :

请注意,我在进行了一些繁重的负载测试后遇到了这个问题,500 个请求带有巨大的 JSON 响应,这解释了泄漏以 MB 为单位 (using latest gh version)

请注意,我是使用 Instruments 的新手,我不确定如何理解这些结果。据 Frames 报道,是的,这看起来像缓存......但我想确定......

所以我开了一个Issue on GH,我希望@johnezang 或任何人能启发我们。

如果这只是对 Instruments 的误解,我深表歉意,我更愿意 :)

【讨论】:

  • 是的,这就是我所拥有的。升级到最终的 Xcode 4.0.1 (4A1006) 后,我再也没有泄漏。不知道为什么。可能是苹果方面的东西,可能是我在最近 2 个版本之间更改的代码(2 周这么多)。不知道。如果您的代码是从块内部调用的,请确保它已正确释放,否则我不知道。 耸耸肩
  • 感谢@johnezang 认为我的代码(显然我)是愚蠢的,结论是 1. Instruments 是正确的 2. 我不知道如何阅读 Instruments 报告 3. JSONKit 已编码由一个非常熟练的人高度优化了他的代码。使用其他 JSON 解析器的人真的应该看看!
【解决方案2】:

根据 Apple 的 WWDC 2010 视频(使用仪器进行高级内存分析),误报泄漏很少见。有时泄漏工具会漏掉泄漏,但它报告的泄漏是可靠的。我在静态方面并不是那么好,但是您是否检查过以确保您没有分配解码器而不释放它?如果它没有发布并且超出范围,那将构成泄漏,对吗?

【讨论】:

  • 在 ASIHTTP 工作线程中发生的 ASIHHTPRequest 泄漏怎么样,除了方法或 2 之外,我没有堆栈跟踪。我稍后会发布更多信息。至于 JSONKit,解码器是静态的,因为我可以每秒调用一次,但即使尝试非静态并释放解码器也没有太大变化。我想解码器做了一些缓存,这算作泄漏,因为 JSONKit 提供了很好的性能。
猜你喜欢
  • 2023-04-10
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
  • 2011-10-29
  • 1970-01-01
  • 2011-10-10
  • 2012-08-22
  • 2012-01-05
相关资源
最近更新 更多