【问题标题】:super dealloc error using multiple table view classes使用多个表视图类的超级释放错误
【发布时间】:2010-03-29 16:20:32
【问题描述】:

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

这一切都很顺利,我为这两个表创建了两个视图控制器。除了让它工作之外,所有代码都很好用,我必须在 videoTableViewController 的第二个选项卡的 - (void)dealloc {} 中注释掉超级 dealloc。

如果我没有收到错误消息:

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

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

【问题讨论】:

    标签: iphone uitableview dealloc super


    【解决方案1】:

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

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

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

    【讨论】:

    • 非常好,同意亚历克斯。所以我有一个 uview 类音频,里面有一个由 UITableView 类 audioTableViewController 控制的表视图。视频的设置相同。因此,我假设我需要释放我正在引用的表视图,我是否在 audioTableViewController 的 dealloc 方法中执行此操作?谢谢
    • 如果这不是UITableViewController的子类,那么是的,你需要释放表格视图。如果您分配了它(即使是通过加载 NIB),您有责任释放它。
    【解决方案2】:

    UITableViewController 为自己的tableView 对象处理内存管理,因此理论上您不必担心。

    正如 Alex 所说, 打电话给[super dealloc] 绝对不好;将其排除在外是内存泄漏。

    要解决这个问题,您需要弄清楚为什么您的表格视图比您的视图控制器寿命更长(这就是导致您出现 FREED(id) 错误的原因)。一种猜测是您将视图留在视图层次结构中但释放了控制器。当您从一个视图控制器移动到另一个视图控制器时,所需的行为是通过调用 [oldView removeFromSuperview]然后释放视图控制器(如果要释放它)从视图层次结构中删除旧视图一点也不。 removeFromSuperview 很重要的原因是超级视图总是保留它们的子视图,所以这可能就是你的 tableView 如此不死的原因。

    如果您的应用不是内存密集型应用,最简单的方法可能是简单地分配视图控制器(而不是释放它们)——这将解决您的问题,尽管它并没有真正解决您的表格视图寿命更长的问题比预期的要好,这可能是一些低效代码的症状,很容易清理。

    【讨论】:

    • 大家好,感谢您迄今为止的帮助。你的回答对我来说很有意义,但我仍然无法让它发挥作用。我已经重组了项目以尝试解决我的问题,目前该选项卡加载了一个带有 audioViewController 的 audio.xib 和相同的视频结构。在 audioViewController.h 我添加一个 UITableView 作为 IBOutlet,例如 @interface audioViewController : UIViewController { IBOutlet UITableView *audioTable; }
    • 然后我在 IB 中将一个 auidoTableViewController 类添加到 audio.xib 并从中删除表。在 IB 中的视图中添加一个表并将其链接到我在 audioViewController.h 中创建的 audioTable。我将数据源和委托链接到 IB 中的 audioTableViewController。然后我添加到 audioViewController.m - (void)viewDidUnload { // 释放主视图的所有保留子视图。 // 例如self.myOutlet = nil; [audioTable removeFromSuperview]; } - (void)dealloc { [audioTable 版本]; [超级释放]; } .
    • 我对视频做同样的事情,当我尝试更改标签时,它会退出,但现在控制台中没有注册错误。这是构建我的应用程序的正确方法吗?我是否试图在错误的位置发布 audioTable 视图?希望这很清楚,对此有真正的兴趣。不知道如何检测出什么问题
    • 一个表控制器带有它自己的表,这就是它的设计目的。查看文档:developer.apple.com/iphone/library/documentation/UIKit/…developer.apple.com/iphone/library/documentation/UserExperience/…
    • 太好了,非常感谢您的帮助,让它工作了。我在我的主视图控制器中为 tableView 和 tableViewController 添加了 IBOutlet,所以我可以在那里释放它们。我已经在房子周围转了一圈,但非常感谢您的帮助
    猜你喜欢
    • 2016-07-28
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 2011-06-01
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    相关资源
    最近更新 更多