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

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

问题描述:

我在加载sqlite数据库中的数据的主应用程序委托中创建了一个对象数组。当我加载TableView时,该类中的一个属性被设置为指向对象数组。然后,在显示TableView时,它正确地返回数组的行数,并从数组中相应对象的属性中显示单元格中的文本。objective-c tableview在重新加载时崩溃

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

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

我已经介入调试器,并确定一切正确,直到reloadData调用。数据库和主数组都是同步的,并且自定义TableView属性也指向主数组。

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

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

+0

我应该指出,我假设数组正在被释放。调试器将数组的值显示为“{(int)[$ VAR count]}对象”,而不是实际的对象数。 – richard

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

首先寻找你直接访问ivars的地方。这是内存管理错误的头号原因。只通过访问器(self.thing)访问ivars,但在dealloc和init中除外。这将解决这类问题的90%。

+0

我不确定你的意思。如何在不使用访问器的情况下访问ivars? – richard

+0

如果你有一个名为“东西”的财产,你把它称为直接访问伊娃的“东西”。如果您将其称为使用访问器的“self.thing”。 “事物”和“自我”在ObjC中运行不同的代码。 –

+0

谢谢。我会查看我的代码并用我发现的内容更新你。 – richard