MonoTouch确定性处理细胞

时间:2014-06-03 16:08:30

标签: c# ios xamarin.ios xamarin

在我们当前的应用程序中,我们需要在自定义UITableViewCells的Dispose()中执行一些清理。

不幸的是,即使我们调用TableView.Dispose(),我们的单元格也不会立即被处理掉。相反,稍后,终结器将调用Dispose(false)。 由于我们被终结器调用,所以我们不应该在这里执行清理:对象可能处于不可预测的状态,并且它的发生时间无法确定。

来自Microsoft文档:

  

当GC检测到对象符合收集条件时,将调用终结器。这种情况发生在不再需要资源之后的某个未确定的时间段内。

还有:

  

如果从终结器调用该方法(disposing为false),则不应访问其他对象。原因是对象以不可预测的顺序最终确定,因此它们或它们的任何依赖项可能已经完成。

是否有解决办法在处理tableview时调用自定义单元格的Dispose()方法?

2 个答案:

答案 0 :(得分:1)

{p> UITableViewCellUITableView重复使用(缓存)。在表上调用Dispose只会删除对象的托管引用。 Iow可能仍然存在对表的原生引用,这将使单元保持更长时间。

目前尚不清楚需要进行何种清理(执行终结器时无法完成)。如果它是基本的UI代码(即你的逻辑在其他地方)那么它应该没问题(你可能能够处理你的逻辑,仅管理,实例)。

答案 1 :(得分:1)

如果你真的需要在桌面上调用Dispose时在每个单独的单元格上调用Dispose,你需要自己处理:

  1. 子类UITableView。
  2. 将您使用的所有单元格存储在此类的单元格列表中。
  3. 覆盖视图上的Dispose,并在列表中的每个单元格上调用Dispose。