objective-c tableview在重新加载时崩溃
问题描述:
我在加载sqlite数据库中的数据的主应用程序委托中创建了一个对象数组。当我加载TableView时,该类中的一个属性被设置为指向对象数组。然后,在显示TableView时,它正确地返回数组的行数,并从数组中相应对象的属性中显示单元格中的文本。objective-c tableview在重新加载时崩溃
我还在导航栏的右上角有一个刷新按钮,它会从网络中下载并解析XML文件,然后更新数据库。
然后,我重新创建数据库中的主对象数组,然后将我的TableView属性指向新的数组,然后让TableView重新加载数据。这是它然后崩溃与EXC_BAD_ACCESS。
我已经介入调试器,并确定一切正确,直到reloadData
调用。数据库和主数组都是同步的,并且自定义TableView属性也指向主数组。
然后,当我使用调试器时,我注意到了一些事情。首先,当它调用numberOfRowsInSection
时,指向主数组的指针是正确的,行数是正确的。其次,当它到达第一个cellForRowAtIndexPath
调用时,指向主数组的指针指向内存的无效部分。实际的内存地址是相同的,但对象数组已经消失。
我不明白如何在重新加载这样的数组中消失,因为我的引用计数应该仍然大于零,所以应该没有垃圾回收。所以我的问题是,有没有人知道可能会发生什么?其次,我如何确定问题的确切位置?
答
你几乎可以肯定地保留阵列。当你说“我的引用计数应该仍然大于零”时,它几乎肯定不是。如果是的话,它不会被释放。
首先寻找你直接访问ivars的地方。这是内存管理错误的头号原因。只通过访问器(self.thing
)访问ivars,但在dealloc和init中除外。这将解决这类问题的90%。
我应该指出,我假设数组正在被释放。调试器将数组的值显示为“{(int)[$ VAR count]}对象”,而不是实际的对象数。 – richard