Xcode4 静态分析器已停止检测未释放的分配

Xcode4 静态分析器已停止检测未释放的分配,xcode4,memory-leaks,static-analysis,Xcode4,Memory Leaks,Static Analysis,我使用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:@"Ic

我使用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];
 }
}
-(无效)泄漏:(id)发送方{
images=[[NSMutableArray alloc]init];

对于(int i=0;i好的,这是我在尝试了许多变体后得到的结果。在上面的代码中,在问题中,我分配了一个图像,然后将保留计数为+1的图像放入图像数组,该数组反过来也保留图像,从而导致保留计数为+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];
这样,图像对象就不会被任何对象所拥有,因此图像对象会四处浮动。这样,仪器也会检测到泄漏

我知道上述情况在实际应用程序中几乎是不可能的,但这是一个用于演示的示例,这样您就不会感到困惑


另外,我实际上并没有试图禁用编译优化(如果它不正常存在的话)。但我看过一个视频,其中静态分析器也检测到循环中的内存泄漏。如果您感兴趣,请搜索它。

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