使用多个表视图类的超级dealloc错误

时间:2010-03-29 16:20:33

标签: iphone uitableview dealloc super

我是Iphone应用的新用户,我正在尝试构建基于标签的应用。我试图在两个标签中都有一个图像顶部的表格。在带有音频链接表的选项卡上,另一个选项卡带有视频链接表。

这已经全部消失了,我为这两个表创建了两个viewControllers。除了让它工作之外,所有代码都很有效我必须在videoTableViewController中的 - (void)dealloc {}中注释掉第二个选项卡中的超级dealloc。

如果我不这样做,我会收到错误消息:

FREED(id):消息numberOfSectionsInTableView:发送给释放的对象

请帮忙,我不知道为什么会这样做......

2 个答案:

答案 0 :(得分:1)

如果您没有调用[super dealloc],那么您的对象不会被释放,而您正在泄漏内存。您需要取消注释[super dealloc]

您在上面注意到的异常意味着表视图仍在尝试将您的已释放对象作为数据源进行访问。这是您需要解决的问题。据推测,正在进行此调用的表视图由已被解除分配的视图控制器拥有。

如果您的视图控制器不是 UITableViewController的子类,那么您将需要release您持有的表视图引用。如果它是UITableViewController的子类,那么必须有一些其他地方,表格视图在retain处不应该是它。

答案 1 :(得分:0)

UITableViewController处理自己的tableView对象的内存管理,所以理论上你不用担心它。

正如亚历克斯所说,打电话[super dealloc]肯定是不好的;将内容泄露出来是一种内存泄漏。

要解决这个问题,你需要弄清楚为什么你的表视图比你的视图控制器更长寿(这就是给你那个FREED(id)错误)。一个猜测是你在视图层次结构中离开视图但释放控制器。当您从一个视图控制器移动到另一个视图控制器时,所需的行为是通过调用[oldView removeFromSuperview]然后释放视图控制器从视图层次结构中删除旧视图,如果您愿意完全释放它。 removeFromSuperview很重要的原因是超级视图始终保留其子视图,因此这可能就是您的tableView如此不死的原因。

如果你的应用程序不是内存密集型的,那么简单地保持你的视图控制器被分配(而不是释放它们)可能是最简单的 - 这可以解决你的问题,虽然它并没有真正解决你的表视图活得更久的问题比预期的,这可能是一些效率低下的代码的一个表现,这些代码很容易清理。