2010-07-22 78 views
0

好的,這是一個基本的問題,但我問,因爲我真的不明白如何正確管理這個。如果我取消註釋最後兩行,那麼這段代碼會崩潰,即使我認爲它不應該。Memory/Obj-C正確的對象釋放。哪些需要發佈?

以下代碼來自自定義的子類UILabel,其中我添加了以下方法setTextFromFloat。

-(void)setTextFromFloat:(float)newValue { 
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setMaximumFractionDigits:2]; 
[formatter setRoundingMode:NSNumberFormatterRoundUp]; 

NSString *numberString = [formatter stringFromNumber:[NSNumber numberWithFloat:newValue]]; 
NSString *newLabelValue = [numberString stringByAppendingString:@"x"]; 
self.text = newLabelValue; 
//[numberString release]; 
//[formatter release]; 
} 

所以,這裏有三個對象,我感到困惑:

一)self.text(舊的字符串值) - 當這種釋放?當我調用這個函數時,我應該釋放self.text的舊內容嗎?

B)格式,我alloc'd這裏NSNumberFormatter幾乎肯定需要釋放

三)怎麼樣numberString?我只是用它作爲中介來構建newLabelValue。如果我釋放它,我相信該程序崩潰,但爲什麼?我不負責通過調用stringFromNumber間接使用的內存?

非常感謝任何智慧,謝謝!

+0

我強烈建議您從Build菜單中執行「Build and Analyze」。它將突出顯示您正在釋放/釋放的內容。 – BarrettJ 2010-07-22 14:01:59

回答

0

numberString不得釋放。你通過一個方便的構造函數獲得它,所以它是自動發佈的。

關於你的self.text屬性,如果你還沒有聲明它,你不負責任。否則,它需要在dealloc方法中發佈。

1

只在您的setTextFromFloat:方法結束時釋放格式化程序。

因爲你的類繼承自UILabelself.textUILabel類的一部分,將在UILabeldealloc方法來發布,所以你不必自己釋放它,如果在你的子類的dealloc方法調用[super dealloc]

numberString正在使用NSString.stringFromNumber:創建,所以它已經設置爲從內部方法中自動釋放。不要手動釋放它,否則你的程序會崩潰。

1

所以,這裏有三個對象,我感到困惑:

一)self.text(舊的字符串值) - 當這種釋放?當我調用這個函數時,我應該釋放self.text的舊內容嗎?

self.text是不是一個對象,它是一個屬性,這意味着它是在一對存取-text-setText:如果有一個實例變量背襯它和它已經保留或複製的語義,則必須釋放實例變量-dealloc

B)格式,我alloc'd這裏NSNumberFormatter幾乎肯定需要釋放

不是 「幾乎可以肯定」,但 「肯定」。

c)那麼numberString呢?我只是用它作爲中介來構建newLabelValue。如果我釋放它,我相信該程序崩潰,但爲什麼?我不負責通過調用stringFromNumber間接使用的內存?

查看Cocoa Memory Management rules。你是否通過new,alloc或者包含copy的方法獲得了numberString?不,你沒有。你保留了嗎?不,你沒有。因此,你不能釋放它,因爲你不擁有它。如果你想擁有它,發送-retain它。然後,當你不再需要保留它時,你必須釋放它。