2012-01-02 64 views
1

我有這個字符串的代碼,我試圖釋放內存的問題,我已經理解,只有釋放它的人初始化並且不是自動釋放,但是我遇到了字符串「結束」的問題,並且隨着nSum發佈。NSString發佈

NSString *urlBase = [[NSString alloc] initWithFormat:@"http://service.svc/"]; 
NSString *op = [[NSString alloc] initWithFormat:@"op1"]; 
NSString * final = [urlBase stringByAppendingFormat:op]; 
NSString * nSum = sumTextfield.text; 
final = [final stringByAppendingFormat:nSum]; 

//release 

[ urlBase release ]; 
[ op release ]; 
//[final release]; error 
//[final autorelease]; error 

感謝您的幫助。

UPDATE:

- (IBAction)mostrarOpciones { 
// code (UP) 
} 

回答

3

如果你使用與初始化,新,複製或mutableCopy開始的方法創建一個對象,那麼你就擁有該對象,並負責釋放它(或自動釋放它)時你已經完成了。如果您使用任何其他方法創建對象,則該對象是自動釋放的,而您不需要釋放它。在這種情況下,如果您想保留該對象,則實際上需要保留該對象。 Apple擁有包含所有這些規則的Memory Management Programming Guide

您發佈的代碼實際上是正確的。您需要釋放urlBaseop,因爲您使用以init開頭的方法(本例中爲initWithFormat:)創建它們。 final和nSum已經爲你自動發佈。 final是由不以init,new,copy或mutableCopy開始的方法創建的(在這種情況下,工廠方法爲stringByAppendingFormat:)。 nSum是通過名爲text的方法返回的,並且您可以假設sumTextField「擁有」它或在將其返回給您之前已自動釋放它,因此您不負責釋放它。

+0

通過應用autorelease最終我得到錯誤。我忘了說這些字符串在IBAction中,我在第三個調用按鈕中出現錯誤。 – JohnPortella 2012-01-02 16:20:12

+0

是的,如果你仔細閱讀我寫的內容,你會注意到,我說最終版已經在你收到時自動發佈,所以你不需要自己釋放或自動釋放它。如果你自動釋放它,它會被自動釋放兩次,這意味着它最終會被釋放兩次,導致崩潰。 – 2012-01-02 16:21:23

+0

現在我通過autorelease來了解那種調用的最終結果。感謝您的幫助。 – JohnPortella 2012-01-02 16:24:11

0

你不能釋放你沒有分配的NSString。既然你的兩個變量沒有被分配,他們不需要被釋放。