2011-12-07 76 views
0

我在加載sqlite數據庫中的數據的主應用程序委託中創建了一個對象數組。當我加載TableView時,該類中的一個屬性被設置爲指向對象數組。然後,在顯示TableView時,它正確地返回數組的行數,並從數組中相應對象的屬性中顯示單元格中的文本。objective-c tableview在重新加載時崩潰

我還在導航欄的右上角有一個刷新按鈕,它會從網絡中下載並解析XML文件,然後更新數據庫。

然後,我重新創建數據庫中的主對象數組,然後將我的TableView屬性指向新的數組,然後讓TableView重新加載數據。這是它然後崩潰與EXC_BAD_ACCESS。

我已經介入調試器,並確定一切正確,直到reloadData調用。數據庫和主數組都是同步的,並且自定義TableView屬性也指向主數組。

然後,當我使用調試器時,我注意到了一些事情。首先,當它調用numberOfRowsInSection時,指向主數組的指針是正確的,行數是正確的。其次,當它到達第一個cellForRowAtIndexPath調用時,指向主數組的指針指向內存的無效部分。實際的內存地址是相同的,但對象數組已經消失。

我不明白如何在重新加載這樣的數組中消失,因爲我的引用計數應該仍然大於零,所以應該沒有垃圾回收。所以我的問題是,有沒有人知道可能會發生什麼?其次,我如何確定問題的確切位置?

+0

我應該指出,我假設數組正在被釋放。調試器將數組的值顯示爲「{(int)[$ VAR count]}對象」,而不是實際的對象數。 – richard

回答

2

你幾乎可以肯定地保留陣列。當你說「我的引用計數應該仍然大於零」時,它幾乎肯定不是。如果是的話,它不會被釋放。

首先尋找你直接訪問ivars的地方。這是內存管理錯誤的頭號原因。只通過訪問器(self.thing)訪問ivars,但在dealloc和init中除外。這將解決這類問題的90%。

+0

我不確定你的意思。如何在不使用訪問器的情況下訪問ivars? – richard

+0

如果你有一個名爲「東西」的財產,你把它稱爲直接訪問伊娃的「東西」。如果您將其稱爲使用訪問器的「self.thing」。 「事物」和「自我」在ObjC中運行不同的代碼。 –

+0

謝謝。我會查看我的代碼並用我發現的內容更新你。 – richard