2012-01-03 40 views
0

我使用的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做过任何意外的更改?或者这是真的应该如何?

+2

我假设你没有使用ARC,是吗? – dasblinkenlight 2012-01-03 18:21:51

+0

对不起,但是我必须明确地打开它还是默认打开它?我如何检查? – 2012-01-03 18:26:26

+0

据我所知,从XCode 4.2开始,对于选择“使用自动引用计数”的新项目,ARC打开。以下是关于[如何关闭它的信息](http://matthiaswessendorf.wordpress.com/2011/09/12/disabling-the-arc-in-xcode-4-2/)。 – dasblinkenlight 2012-01-03 18:30:44

回答

0

好的,这是我尝试了很多变体后得到的结果。在上面的代码中,在问题中,我分配一个图像,然后将保留计数为+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]; 

然后将不会有拥有图像对象的对象,因此它将四处漂浮。这样仪器也会检测到泄漏。

我知道上述情况在真实世界的应用程序中几乎是不可能的,但它是用于演示目的的示例,因此您不会感到困惑。

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

相关问题