2013-06-24 32 views
1

检测的I跨越这段代码内存泄漏不受静态分析器

UIImageView *image = [[UIImageView alloc] initWithFrame:imageFrame]; 
[image setImage:[UIImage imageNamed:@"myImage"]]; 
[self.view addSubview:image]; 
image = nil; 

鉴于ARC不使用来了,我假定它会导致image对象上的内存泄漏。尽管如此,静态分析器并不能捕捉到这一点。

我想知道谁是错误的,静态分析仪或我,我想对此有第二意见。

上面的代码实际上是否泄漏?

+0

我认为它的确如此。你确定分析仪知道缺乏ARC吗? – 2013-06-24 09:34:32

+0

是的,因为正确检测到其他泄漏。 –

+0

我已经将代码添加到'viewDidAppear'并获取*“存储到'image'中的对象的潜在泄漏”*警告如果我使用Xcode 4.6.3分析该代码。 (我在没有ARC的情况下创建了一个新的“单一视图应用程序”。) –

回答

1

原来的一个误会是我(废话!)

我审计是相当大的应用程序,我错过了一个事实,即开发人员在特定的类上启用了带有-fobjc-arc标志的ARC,其中包括上述代码段中的一个。

万岁到静态分析仪!

0

self.view有指向它的子视图,将让您image访问,并保持基准计数器大于0

CGRect imageFrame = CGRectMake(100, 100, 100, 200); 
UIImageView *image = [[UIImageView alloc] initWithFrame:imageFrame]; 
NSLog(@"image=%@", image); 
[image setImage:[UIImage imageNamed:@"Default"]]; 
[self.view addSubview:image]; 
image = nil; 

UIView *v = [[self.view subviews] objectAtIndex:0]; 
NSLog(@"v=%@", v); 

当你把一个数组(用于ARC)self.view = nil;image引用计数器将下降内存将被释放。我不认为你可以创建一个泄漏这样:)

+0

你绝对可以。 'image'将会降低1,但在视图中增加1时也会升高1。 –

+0

@ user511:这是不正确的。 '[self.view addSubview:image]'将'image'的保留计数增加1。 'self.view = nil'会再次减少它。但是如果'alloc'没有被'release'平衡,那么图像对象将永远不会被释放并因此泄漏。 (假设手动引用计数) –

+0

对不起,我读到你实际上在使用ARC。 – user511