【问题标题】:iphone table cell retain/releaseiphone 表格单元格保留/释放
【发布时间】:2010-11-18 19:07:59
【问题描述】:
UITableViewCell *cell = [tableView 
dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
 reuseIdentifier:CellIdentifier] autorelease];
 ...
 return cell;

此代码不会在对单元格进行任何操作之前自动释放单元格吗?据我所知,单元格本身没有保留,当返回 ell 时,自动释放可能会启动,不是吗?

这两种方法似乎都有效,我只是想完全理解为什么会这样。

【问题讨论】:

    标签: iphone memory-management uitableview


    【解决方案1】:

    NSAutoreleasePool 耗尽之前,自动释放不会“启动”,当方法返回时不会这样做。除非您手动创建NSAutoreleasePool,否则池在事件循环期间会被耗尽。只要在返回事件循环之前将表格单元格添加到 UITableView(保留它),单元格就会一直存在。

    【讨论】:

      【解决方案2】:

      当您返回一个单元格时,您遵循的是由方法创建的对象是自动释放的标准约定,并且如果某些东西关心它需要保留它们的对象。

      在这种情况下,“某事”是 UITableView 要求您提供一个单元格。当此方法返回单元格时,调用您的代码会保留它并保留它,直到释放表格视图。

      那么,为什么自动释放在它返回之前不让它释放呢?因为在 Objective-C 中发生的一切都在所谓的“RunLoop”中,这意味着——它是一个反复运行的循环。在表格视图完成调用您之后它返回,然后告诉表格视图更新的东西返回,依此类推,直到到达顶部运行循环 - 此时执行自动释放并且单元格保留计数下降一。但同样,这没关系,因为 UITableView 保留了它。

      【讨论】:

        【解决方案3】:

        值得您多了解一下 iPhone 内存管理。

        基本上,[alloc] 和 [copy] 都将保留计数增加一。所以下面一行:

        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
         reuseIdentifier:CellIdentifier] autorelease];
        

        将新单元格对象的保留计数从零增加到一。

        可以在完成后手动将保留计数减少回零,方法是键入以下内容:

        [cell release];
        

        而不是自动释放。这会将其保留计数减少到零,此时 iPhone 系统将自动为该对象释放内存。 [请注意,您永远不会直接调用 [cell dealloc] - 相反,当保留计数回到零时,会自动发生 dealloc。]

        但是,您很难知道何时不再需要该单元格。所以改为使用 [autorelease]。

        无需深入了解自动释放的工作原理,它实际上会收集所有不再引用的对象,并在下一个运行周期开始时释放它们(并因此释放它们)。

        只要您有对单元格对象的引用,它就不会被自动释放。一旦你没有引用它,它就会被添加到自动释放池中,并在适当的时候被释放。

        抱歉,这有点牵扯 - 这有帮助吗??!

        【讨论】:

        • 不对!!自动释放意味着稍后将其计数回零......自己调用 [cell release] 将导致稍后崩溃。
        • 是的,我也已经知道了。我了解引用计数 jsut 不确定 UITableViewCell 的工作方式。在调用代码中保留对象之前,我已经释放了对象,尽管这可能是由 gdb 引起的。
        • Kendall 你投反对票太仓促了......我的整个文本都说虽然你可以手动释放它,但你已经(正确地)将它设置为自动释放。显然,如果您实际上调用了 [cell release] 并同时使用了 [autorelease],它会崩溃! 叹息希望人们在投票之前阅读......
        • 布伦登,你的问题是“据我所知,单元格本身没有保留”,这是我正在纠正的...... [alloc] 语句将保留计数增加一。
        • h4xxr,我知道单元格有保留,但它会自动释放。我的灰色区域是发生这种情况的时候。我假设它返回后池会被耗尽。我不熟悉自动池何时耗尽。
        猜你喜欢
        • 2011-07-25
        • 2011-07-20
        • 2013-01-22
        • 1970-01-01
        • 2011-06-20
        • 2011-04-13
        • 2022-08-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多