2010-01-16 130 views
3

我正在開發一個應用程序,我想確保我正確地管理內存並釋放我應該做的所有事情。在我的viewDidLoad方法中,我分配了一些變量來決定應用於視圖的哪個背景(用於國際化),如果我不釋放它們,該應用可以正常工作。iPhone內存管理

問題是,如果我釋放變量,應用程序將崩潰。從viewDidLoad中的代碼如下:

// Set the background image based on the phone's preferred language 
NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0]; 
NSString *backgroundImageName = [[NSString alloc] init]; 
backgroundImageName = [NSString stringWithFormat:@"background-%@.png",language]; 
self.view.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:backgroundImageName]]; 

... do some more initialization stuff ... 

// IF THE FOLLOWING ARE RELEASED THE APP WILL CRASH!!! 
//[backgroundImageName release]; 
//[language release]; 

爲什麼會釋放backgroundImageName和語言變量導致應用程序崩潰?

回答

6
NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0]; 

這裏,language並不需要被釋放,因爲objectAtIndex:自動釋放給你。按照慣例,如果你有alloc編輯,new編輯或copy編輯它,你擁有一個對象,否則你不。

self.view.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:backgroundImageName]]; 

這裏,UIColor對象確實需要被釋放(因爲你alloc編吧)。

NSString *backgroundImageName = [[NSString alloc] init]; 
backgroundImageName = [NSString stringWithFormat:@"background-%@.png",language]; 

這裏通過[[NSString alloc] init]返回的字符串確實需要被釋放(因爲你已經alloc編吧)。但是,下一行更改backgroundImageName指向一個新的自動釋放字符串,失去對原始字符串的最後引用而不釋放它(內存泄漏)。 backgroundImageName不應該被釋放,因爲它已經被自動釋放。

您可以通過釋放UIColor並消除未使用的字符串來避免泄漏。例如:

NSString *backgroundImageName = [NSString stringWithFormat:@"background-%@.png",language]; 

......還有......

UIColor* backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:backgroundImageName]]; 
self.view.backgroundColor = backgroundColor; 
[backgroundColor release]; 
+0

真棒交代。現在非常有意義。謝謝! – 2010-01-16 19:00:51

0

簡短的回答: 當你創建一個使用構造函數沒有這個字的init那麼你是不負責釋放它

看到this更多解釋的對象

也是內存management guide是一個很好的資源瞭解更多關於目標內存管理的知識c

0

您並未創建語言字符串;你只是回來參考。只有具有「新」,「複製」或「分配」(根據約定)的方法返回非自動釋放對象。對於所有其他方法,假設您將放棄該變量,因此如果您想保留它,您必須保留它。另一方面是:除非你保留它們,否則你不應該釋放這些返回的對象。

此代碼中的另一個問題是backgroundImageName被分配兩次。第一次初始化正在丟失。擺脫它,只保留第二個,並擺脫這兩個 - 釋放電話,他們不需要。