2013-06-24 28 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