2011-05-24 26 views
0

我有UIImage對象潛在的內存泄漏問題。代碼如下。請幫忙。從iOS的UIImage內存泄漏

 

UIImage *image = nil; 

if (x == 0) { 
    image = [UIImage imageWithCGImage:cg1]; 
} else { 
    image = [UIImage imageWithCGImage:cg2]; 
} 

UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 

[image release]; 

我試過的if-else塊後釋放UIImage對象,但Xcode的警告「未此時調用者所擁有的對象的引用計數錯誤減量」,

如果我刪除[圖像發佈],它顯示「在線分配的對象的潛在泄漏...」。

如何解決問題?

謝謝。

回答

0
UIImage *image = nil; 

if (x == 0) { 
    image = [UIImage imageWithCGImage:cg1]; 
} else { 
    image = [UIImage imageWithCGImage:cg2]; 
} 

UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 
// Some code 
[imageView release]; 

你把對象imageView,而不是image的所有權。所以你應該發佈imageView而不是image。看看Object ownership in Apple's Memory Management guide

+0

嘗試了您的建議。警告仍然顯示 - 在線分配的物體的潛在泄漏... – user403015 2011-05-24 11:00:27

+0

哪個物體負責泄漏。我猜這個泄漏是在其他地方...... – visakh7 2011-05-24 11:01:42

+0

如何調查?我嘗試過使用樂器,但我真的不知道用它來檢查泄漏。 – user403015 2011-05-24 11:03:14

3

的問題是,[UIImage new]相同[[UIImage alloc] init],所以你已經有一個保留的實例。然後通過調用[UIImage imageWithCGImage:]來拋出指向實例的指針,該指針返回一個不需要保留的自動釋放實例!

該解決方案將[UIImage new]從您的代碼以及末尾的[image release]中排除。

+0

我試過「UIImage * image = nil;」,但給出了相同的警告。 – user403015 2011-05-24 10:45:21

+0

是的,你也需要拋出[image release],因爲圖像已經被自動釋放。 – JustSid 2011-05-24 10:46:24

+0

謝謝,但是在我刪除[image release]之後,它顯示「線上分配的對象的潛在泄漏...」。請幫忙。 – user403015 2011-05-24 10:51:06

0

你分配使用new方法UIImage對象的新實例,並將其分配給image變量。然後,您立即通過使用imageWithCGImage:方法爲變量分配不同實例來泄漏該實例。

開始時不需要做UIImage *image = [UIImage new];。你可以簡單地聲明你的變量,而不用指定任何實例。最佳做法是最初將nil分配給它。

當你這樣做時,你不需要稍後釋放圖像對象,因爲imageWithCGImage返回一個自動釋放對象。

+0

嘗試了您的建議。警告仍然顯示 - 在線分配的對象的潛在泄漏...任何想法解決? – user403015 2011-05-24 11:01:55