【问题标题】:Static analyzer stopped detecting unreleased allocations静态分析器停止检测未释放的分配
【发布时间】:2012-01-03 18:20:25
【问题描述】:

我使用 Xcode 4。这是一个巨大的内存泄漏,我认为这是静态分析器最简单的搜索之一:

-(void)leak:(id)sender{
 images=[[NSMutableArray alloc] init];
 for (int i=0; i<=2000; i++) { 
     UIImage *image=[[UIImage alloc] initWithContentsOfFile:[[NSBundle   
 mainBundle]pathForResource:@"Icon" ofType:@"png"]];
     [images addObject: image];
 }
}

但是当我选择产品|分析时,分析器没有捕获任何东西。我是否对 Xcode 进行了任何意外更改?或者这真的应该是这样吗?

【问题讨论】:

  • 我假设你没有使用 ARC,是吗?
  • 对不起,我必须明确打开它还是默认打开它?我该如何检查?
  • 据我所知,从 XCode 4.2 开始,ARC 会为您选择“使用自动引用计数”的新项目打开。这是how you can turn it off上的信息。
  • 我检查了我的 Xcode 版本,它是 4.1 而不是 4.2,我在构建设置中找不到任何关于 ARC 的信息
  • 那你没有使用ARC,因为4.2之前不支持。这是您怀疑应该触发警告的images 吗?它看起来不像泄漏,更像是指向我的悬空指针(但我可能错了,因为我自己对 iOS 开发还比较陌生)。

标签: xcode4 memory-leaks static-analysis


【解决方案1】:

好的,这是我在尝试了许多变体后得到的。在上面的代码中,在问题中,我分配了一个图像,然后将保留计数为 +1 的图像放入 images 数组,该数组又保留了图像,从而导致保留计数为 +2。理想情况下,我必须在将图像对象添加到数组后释放它。但我没有,这是明显的内存泄漏。但奇怪的是静态分析仪无法捕捉到这种泄漏。 现在,这就是问题所在。代码在 for 循环中。如果我将它放在循环之外,分析器会检测到它。所以我认为这与编译优化有关,不会注意到循环内的危险。

还有一个问题。虽然分析仪可以检测到泄漏,但如果我在仪器上进行测试,仍然无法检测到泄漏。也很奇怪不是吗?好的,这就是为什么。这是因为如果有对对象的任何引用,仪器不会显示泄漏。所以我给你两个案例来比较:

  images=[[NSMutableArray alloc] init]; 
  UIImage *image=[[UIImage alloc] initWithContentsOfFile:[[NSBundle   
  mainBundle]pathForResource:@"Icon" ofType:@"png"]];
  [images addObject: image];

这样静态分析器将捕获内存泄漏(注意代码不在循环内)。但仪器不会。但是如果我再添加一行代码:

  images=[[NSMutableArray alloc] init]; 
  UIImage *image=[[UIImage alloc] initWithContentsOfFile:[[NSBundle   
  mainBundle]pathForResource:@"Icon" ofType:@"png"]];
  [images addObject: image];

  [images release];

那么就没有对象拥有该图像对象,因此它会四处浮动。这样仪器也将检测到泄漏。

我知道上述情况在现实世界的应用程序中几乎是不可能的,但这是一个用于演示目的的示例,以免您感到困惑。

附:我实际上并没有尝试禁用编译优化(如果它存在的话。)。但我看过一个视频,其中静态分析器也检测到循环内的内存泄漏。有兴趣的可以去搜一下。

【讨论】:

    猜你喜欢
    • 2011-09-06
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多