2010-07-05 77 views
0

我有一種情況,我需要暫時使用一些字符串,但是我已經閱讀了許多相互衝突的內容,所以我對有什麼最好的處理方式感到困惑。處理臨時字符串的更好方法是什麼?

我需要指定一些字符串內的,如果結構,但使用它們,如果結構之外所以他們需要的,如果,我是想這樣外部創建:

NSString *arbString = [[NSString alloc] init]; 

if(whatever) 
{ 
    arbString = @"Whatever" 
} 
else 
{ 
    arbString = @"SomethingElse" 
} 

myLabel.text = arbString; 
[arbString release]; 

我所看到的例子,人們只是使用:

NSString *arbString; 

創建字符串變量

谷歌的目標C指南說,它最好在創建時自動釋放:

「當創建新的臨時對象,自動釋放他們爲你創建它們,而不是一個單獨的新聞稿後在同一方法在同一行」:

// AVOID (unless you have a compelling performance reason) 
MyController* controller = [[MyController alloc] init]; 
// ... code here that might return ... 
[controller release]; 

// BETTER 
MyController* controller = [[[MyController alloc] init] autorelease]; 

所以我不知道,這是最好的實踐?

+0

這回答了我的問題,似乎我只是不正確的措辭。 http://stackoverflow.com/questions/2706955/objective-c-if-statements-not-retaining/2706957#2706957 – 2010-07-05 12:26:09

回答

1

在您發佈的示例中,實際上您將丟失對在arbString = @"Whatever"中指定的NSString的引用。然後釋放字符串常量(順便說一句,這是不可釋放的)。

所以有一個內存泄漏,因爲你永遠不會釋放你創建的NSString。

請記住,所有這些類型都是指針,所以=只重新分配它們。

至於這個問題,在這個例子中,你不需要[[NSString alloc] init]。您無需將字符串複製到本地變量中,只需將myLabel.text設置爲字符串常量@"Whatever"即可。

(編輯:這是不是說你不能使用你的指針arbStringarbString = @"Whatever"; myLabel.text = arbString是好的,但這個只是指針賦值,不是抄襲。)

如果你需要操作字符串,你回來之前, ,你會創建一個NSMutableString,並且釋放或者自動釋放它。個人而言,使用類方法創建自動釋放對象,因此在本例中,我使用[NSString string][NSString stringWithString:],它們返回自動釋放對象。

+0

感謝您的快速回復。你回答了我所問的問題,但似乎我錯誤地說了這個問題,問題與範圍有關,而且我有點偏離正軌。 – 2010-07-05 12:32:35

相關問題