objective-c tableview在重新加载时崩溃

时间:2011-12-07 04:05:47

标签: objective-c tableview

我在主app代理中创建了一个对象数组,它正在从sqlite数据库加载数据。当我加载TableView时,此类中的属性设置为指向对象数组。然后,当显示TableView时,它会正确返回行数的数组计数,并从数组中相应对象的属性中显示单元格中的文本。

我还在导航栏的右上角有一个刷新按钮,它从网络中下载并下载XML文件,解析它,然后更新数据库。

然后,我从数据库重新创建主要对象数组,并将我的TableView属性指向新数组,然后让TableView重新加载数据。这是它与EXC_BAD_ACCESS崩溃的地方。

我已经使用调试器并确定在reloadData调用之前一切正常。数据库和主数组都是同步的,自定义TableView属性也指向主数组。

然后,当我逐步调试调试器时,我注意到了一些事情。首先,当它调用numberOfRowsInSection时,指向主数组的指针是正确的,并且行数是正确的。其次,当它到达第一个cellForRowAtIndexPath调用时,指向主数组的指针指向无效的内存部分。实际的内存地址是相同的,但对象数组已经消失。

我无法理解数组如何在重载中间消失,因为我的引用计数仍应大于零,因此不应该有垃圾回收。所以我的问题是,有没有人知道可能会发生什么?其次,我如何确定问题的确切位置?

1 个答案:

答案 0 :(得分:2)

你几乎肯定会保留阵列。当你说“我的引用计数仍然应该大于零”时,它几乎肯定不是。如果是的话,它就不会被释放。

首先寻找您直接访问ivars的任何地方。这是内存管理错误的首要原因。除了dealloc和init之外,只能通过访问器(self.thing)访问ivars。这将解决90%的这类问题。