2009-10-09 282 views
0

我目前正在教我自己Objective-C和iPhone開發使用非常好的'開始的iPhone開發'。我一直在玩弄其中一個示例應用程序,並且我試圖在按下另一個按鈕時用文本字段中的文本更新一個按鈕。我已經建立了我的動作和鏈接以及所有爵士樂。單一的方法/功能/調用的代碼如下標題更新導致iPhone應用程序崩潰按鈕

-(IBAction)updateButtonPressed 
{ 
NSString *newCaption = [[NSString alloc] initWithString:@"."]; 

newCaption = tfUpdateText.text; 
[btnPressMe setTitle:newCaption forState:UIControlStateNormal]; 

[newCaption release]; 


} 

它完美的我第一次按下按鈕,也許兩個或三次然後崩潰之後。我顯然在做一些非常愚蠢的事情,但我無法看到它。這是我添加的所有內容(以及聲明,屬性 - 綜合等)。有人可以指出我明顯的內存泄漏。

更新:

如果我改變這個

-(IBAction)updateButtonPressed 
{ 

[btnPressMe setTitle:tfUpdateText.text forState:UIControlStateNormal]; 



} 

它工作正常,但可能有人向我解釋,我是做什麼錯誤?

回答

2

您錯誤地管理內存。什麼是-initWithString:@"."?你生成一個常量字符串@「。」,然後泄漏它,然後指向一個不同的字符串(tfUpdateText.text),然後將該指針分配給標題,然後釋放-text對象。

這既是泄漏又是過度釋放。這是過度釋放,崩潰。

也許你的意思是這樣的:

-(IBAction)updateButtonPressed 
{ 
    [btnPressMe setTitle:tfUpdateText.text forState:UIControlStateNormal]; 
} 
+0

感謝您的解釋 –

1

你在這裏沒有正確使用NSString(並且確實做了比所需更多的工作)。 NSString只是指針,所以你對newCaption的第二個任務就是孤立第一個。當你稍後發送[newCaption release]時,你不會將它發送到你的alloc'd對象,而是發送給tfUpdateText.text,而你沒有保留它。擺脫分配和釋放,你應該全部設置。

+0

感謝,這使得它更清晰。 –

2

你有一個內存管理錯誤。您正在發佈的newCaption參考對象與您初始化的參考對象不同。您意外泄漏您分配的NSString,並且發佈tfUpdateText.text

可以刪除temperory變量,如:

-(IBAction)updateButtonPressed 
{ 
    [btnPressMe setTitle:tfUpdateText.text forState:UIControlStateNormal]; 
} 
+0

即使您沒有在這裏崩潰,tfUpdateText.text(從這段代碼中看來,您目前並不擁有)的發佈將導致更多的問題。 – mmc