【问题标题】:Object created in Interface Builder getting dealloc'ed too soon在 Interface Builder 中创建的对象过早地被解除分配
【发布时间】:2010-04-10 06:22:58
【问题描述】:

项目

我正在开发一个相对简单的 iPhone OS 项目,该项目基于导航控制器,具有根表视图和详细表视图。点按主列表中的项目以在推送的表格视图中查看其详细信息。

设置

我将两个视图的数据源分解为它们自己的对象,以免混淆视图控制器的目的。完成此操作后,表视图不再具有数据源,因为这些方法现在位于单独的文件中,因此我使用 Object 项在适当的 XIB 文件中创建了每个数据源类的实例(将其拖入,然后设置其类) .然后,为了将 tableview 实际连接到它们的数据源,我将每个 tableview 的 dataSource 出口设置为 Interface Builder 中的黄色数据源对象。表视图委托仍设置为其视图控制器。

问题

根表视图工作得很好,但是当您点击一行以推送到详细视图时,数据源对象会按预期实例化,然后立即释放,导致崩溃(numberOfSectionsInTableView:在释放时调用目的)。我无法弄清楚为什么数据源在我需要它时自动解除分配当时和那里用于详细视图,正如我在 Interface Builder 中的数据源对象创建和 tableview 连接所示.更令人困惑的是,这种方法对根 tableview 效果很好!

问题

有什么明显的我遗漏会导致这种情况发生吗?或者,这甚至是为表视图控制器实例化数据源的正确方法吗?从 view 控制器中执行它似乎是糟糕的面向对象编程,它应该只关心视图。我可以把所有东西都塞进两个表视图控制器类中,它可能会工作,但它不会像我想要的那样模块化。

谢谢!

【问题讨论】:

    标签: iphone cocoa-touch dealloc


    【解决方案1】:

    detail-table-view-controller 数据源的属性是什么样的?你打电话保留吗?问题可能是你有:

    @property (nonatomic, assign) IBOutlet id <UITableViewDataSource> dataSource
    

    代替:

    @property (nonatomic, retain) IBOutlet id <UITableViewDataSource> dataSource
    

    【讨论】:

    • 这可能是我的问题的一部分...我只是在 XIB 中使用标准 UITableView 的 dataSource 插座(文件的所有者是数据源类,而不是表视图本身)。想想看,我的数据源没有内存管理!即使添加了该属性,下一步是什么?我可以看到 IB 没有什么可以改变的。
    • 您是否有数据源的引用出口设置?澄清一下,您是如何将符合 UITableViewDataSource 的对象添加到界面构建器的?
    • 我没有在代码中设置出口,只有 tableview 上的 dataSource 连接到 IB 中的数据源对象。为了创建我的数据源的实例,我将一个对象拖出库面板并将其类设置为我的数据源类。然后我将 tableview 的 dataSource 连接到该对象。
    • 好的。尝试添加示例中的第二个属性。然后在界面生成器中将其拖过来作为新的引用出口。 Se 是否保留数据源。
    • 啊,成功了!我让我在 IB 中的数据源实例成为我的视图控制器类的数据源出口(我猜你可以说由该类“拥有”和内存管理),同时将它作为 tableview 的数据源。我还将 [dataSource release] 放在我的视图控制器的 dealloc() 中,以便在我完成它时释放它。谢谢!
    猜你喜欢
    • 2011-06-21
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 2013-10-18
    相关资源
    最近更新 更多