2012-02-24 75 views
0

我已經編寫了代碼,當您點擊按鈕時,它會打開帶有圖像的新屏幕。在新的屏幕上有按鈕可以關閉屏幕,並返回到主屏幕。它工作正常,如果我做這樣的(無泄漏等):iPhone/iPad UIImage initWithContentsOfFile:

img = [UIImage imageNamed: @"Galaxy"]; 
ImageDisplay *display = [[ImageDisplay alloc] initWithImage:img]; 

但是,如果我有這樣的替換這行代碼:

img = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Minnesota" ofType:@"png"]]; 
ImageDisplay *display = [[ImageDisplay alloc] initWithImage:img]; 
[img release]; 

它作爲我有內存泄漏。每次我打開圖像屏幕,應用程序需要越來越多的內存。但是所有的dealloc都被調用,即使[img retainCount]在最終發佈之前顯示1。有沒有可能在這裏有一個錯誤,因爲我找不到什麼錯誤?

編輯:

這裏是ImageDisplay dealloc方法,這種方法被稱爲:

-(void) dealloc { 
    [img release]; 
    [super dealloc]; 
} 

回答

0

注意,因爲imageNamed:是一類方法不是一個實例方法,你可以使用這樣的:

UIImage *myImage = [UIImage imageNamed:@"pony.png"]; 

使用initWithContentsOfFile您發佈的代碼看起來正確的,所以泄漏必須是在某處你ImageDisplay類。

0

嘗試使用這一個,而不是,你不需要分配和釋放:

[UIImage imageWithContentsOfFile:(NSString *)name] 
+1

豈不是更好/比'initWithContentsOfFile'快? – 2013-04-08 13:30:07

+0

我剛剛嘗試過,它比你的方式消耗的內存少得多。 – 2013-06-13 17:05:23

3

ImageDisplay *display是保持圖像。它應該是。當你釋放它時,它應該釋放所有保留的實體。在你顯示的代碼中,你並沒有釋放它。典型的用法是告訴包含視圖控制器以模態方式顯示它(或將其推送到導航控制器上)並釋放它,從而將其保留生命週期交給任何視圖控制器管理它。不同之處在於,在您的第一個代碼示例中,*img是自動發佈的,並且會在適當的時候自行釋放,而第二個則不是。

ARC會在這裏保存您的培根,並大大簡化您的代碼。

而且你應該谷歌的術語「靜態方法」,因爲你的工作真的很難調用靜態方法的類的對象,這就好比繞來繞去你的屁股讓你肘部的實例。

此外,請停止看retainCount。各種各樣的東西可能會保留你的對象在框架的引擎之下。使用retainCount作爲調試策略的一部分是confusionville的單程票。

+0

在我的dealloc方法中,我釋放它...我將添加該代碼。 – MegaManX 2012-02-24 17:19:03

相關問題