【问题标题】:UITableViewCell object deinit never calledUITableViewCell 对象 deinit 从未被调用
【发布时间】:2016-01-17 13:46:21
【问题描述】:

问题出在我的项目中。但我也在新的 xcode 草案项目中尝试了 Master-Detail Application 之一。

我已经创建了基本 Cell 类并将单元映射到情节提要上。删除操作后 deinit 从未调用过。对单元格的引用没有强弱之分。

class Cell:UITableViewCell {
    deinit{
        print("Deinit Called")
    }
}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! Cell

    let object = objects[indexPath.row] as! NSDate
    cell.textLabel!.text = object.description
    return cell
}

【问题讨论】:

  • 我猜原因是table view cell被重用了,所以它们实际上并没有被删除,实际上只是回到了cell pool。
  • 在取消初始化表格视图之前,您的单元格不会被取消初始化,那是因为表格视图持有它的强引用

标签: swift uitableview memory-management deinit


【解决方案1】:

UITableViewCells 作为一个惰性变量工作,它们在第一次使用时被初始化,并且只要初始化它们的 UITableView 处于活动状态,它们就会保持活动状态,这发生在 register:forIdentifier: 被调用的那一刻。如果您使用的是为您完成的故事板。

为什么会这样?每个单元格都可以使用 dequeueReusableCellWithIdentifier 重新利用,因此 UITableView 保持一个实例处于活动状态,以便在需要时使用。

如果你需要清理一些数据,只需在 UITableViewCell 上调用 prepareForReuse

【讨论】:

  • 如果我想从我的单元格中删除一个观察者怎么办?应该在哪里做呢?
  • @P5ycH0 从 iOS 9 开始,不再需要在 deinit 中删除观察者。请参阅此处的讨论部分:developer.apple.com/documentation/foundation/notificationcenter/…。但如上所述,您可能希望停止在 prepareForReuse 中收听并在 cellForRowAt 中重新开始。
猜你喜欢
  • 2015-05-15
  • 2015-01-14
  • 1970-01-01
  • 2016-09-05
  • 2021-10-22
  • 2015-10-21
  • 2021-05-16
  • 2018-05-24
  • 1970-01-01
相关资源
最近更新 更多