2012-09-12 114 views
0

我正在研究一個iPad應用程序,其中有一個表格視圖。當用戶在表格中選擇一行時,我使用didSelectRowAtIndexPath來打開彈出窗口。當我嘗試使用某個按鈕時,收到一條錯誤消息,指出「發送到釋放實例的消息」。我最初雖然錯誤被popover拋出(在viewDidLoad之類),所以我在代碼中加入了一個斷點。令我驚訝的是,我能夠在我的表格視圖中一步步完成popover和didSelectRowAtIndexPath的其他部分(實際上它只涉及到一些if塊)。當我在自動生成的代碼中出現一些未出現在我的任何類文件(看起來像0x0010d71d <+1164> mov 0x6...)的代碼時,會出現此錯誤。是否有一個方法在didSelectRowAtIndexPath之後總是被調用?

所以,我的問題是,我怎麼找到這個錯誤被拋出的地方?在didSelectRowAtIndexPath之後是否有另一種方法會自動運行,可能會在某處出現混亂?

+1

它告訴你哪個消息和實例屬於哪個類? –

+1

當你分配popover時你使用'autorelease'嗎? – jere

+0

@Phillip Mills:這是說 - [CFString發佈]。我從來沒有明確地使用CFString,所以它必須來自別的東西。也許我會谷歌它,看看我是否找到有用的東西。 – GeneralMike

回答

0

好了,大家的反應使我找到malloc error -[CFString release],這幫助我找出我在我的酥料餅的一個字符串,我通過

myString = [NSMutableString stringWithString:[myGlobalFunctionClass getMyString]]; 

viewDidLoad的Alloc由於我的Alloc這種方式,它被設置爲自動釋放。問題是我明確[myString release];myString = nil;viewWillAppear。刪除release=nil零件清理了我的錯誤。

要回答我發佈的實際問題,我相信autorelease直到模擬器實際嘗試顯示彈出窗口(將在didSelectRowAtIndexPath之後運行)纔會觸發。因爲這發生在我明確 viewWillAppear後,它試圖autorelease東西不在那裏。只是重申一下,正確的做法是讓autorelease結束,而不是[myString release]我的代碼中的任何地方。

有人可以驗證這是正確的嗎?正如我在我的評論中提到的,我對iOS開發還很陌生。在項目結束時我有一種感覺,我將能夠回到我所做的第一件事,並根據最佳實踐更有效地做更多的改進。

+1

是的,[myString發佈]對於一個自動發佈的對象來說是一個巨大的禁忌。升級到ARC,有一個關於ARC如何更新項目的WWDC 2011視頻。 – CSmith

1

在您的DEBUG構建中啓用NSZombieEnabled(請參閱How do I set up NSZombieEnabled in Xcode 4?),以找到您正在訪問的已釋放/釋放的對象的實例。

另外,考慮將您的項目升級到ARC,這可能會解決像這樣的內存管理問題。

+0

我已經NSZombieEnabled不已,當我做了一個分析,我發現了唯一的東西是一幫在我酥料餅的細胞(這也是從一個UITableViewController建)「其在初始化過程中存儲的值永遠不會讀」。我對這條消息並不熟悉,所以我現在正在查看它,看看這是否有幫助。 – GeneralMike

+0

編輯:它不在我彈出窗口中的單元格上,它位於原始視圖的「cellForRowAtIndexPath」單元格中。 – GeneralMike

+0

所以現在在我的'cellForRowAtIndexPath'我有: '靜態NSString * CellIdentifier = @「Cell」; MyCell * cell =(MyCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; cell = [[[MyCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; //加上一些關於從indexPath.row設置數組中的標籤的東西' 從我收集的內容中,我爲'cell'做了兩次alloc。這部分我幾乎是從教程中直接複製的,所以我不太確定它究竟做了什麼,或者我需要刪除哪一部分,或者如何解決它。 – GeneralMike

相關問題