拆除UITableViewDataSource

时间:2013-09-04 15:29:01

标签: ios objective-c uitableview

在我们的应用程序中,我们有几个UITableViews,它们具有网络支持的数据源,实际填充可能需要一些时间。这是典型的情况:

  1. 用户触发视图。
  2. 在viewDidLoad中,创建了视图的数据源。
  3. 模型的-load方法称为
  4. 模型发出网络请求以获取一些数据 ...
  5. 在请求完成之前,用户退出视图。
  6. 调用视图的ViewWillDisappear,ViewDidDisappear,ViewDidUnload和dealloc方法。
  7. 请求完成。不幸的是,全部或部分表视图已经消失,因此造成了严重破坏。
  8. 因此,我们的解决方案是正确“拆除”数据源并取消任何未完成的网络请求,这样就不会发生这种情况。我的问题是:

    1. 拆除数据源的“正确”方法是什么?您是否丢失了对它的所有引用,并使用-dealloc取消未完成的网络请求?

    2. 你应该把它拆掉?在ViewDidUnload中?的dealloc?

    3. 同样的两个问题适用于模型,实际上:什么是正确的方法将其拆除?什么时候?

    4. 请注意,这不仅适用于网络请求:我们有另一个使用Geolocation的视图,有时在调用Geolocation完成块时,它应该更新的视图早已消失。

      谢谢!

      P.S。其他问题:

      1. 对于UITableView,在调用UITableView的-dealloc之前,是否可以取消分配视图中的行?如果它们在ViewWillDisappear时间被释放,并且请求恰好在此之后完成,但BEFORE -dealloc,那么如果请求碰巧尝试并更新UITableView行,则会发生破坏。
      2. 这有意义吗?

1 个答案:

答案 0 :(得分:1)

您使用的是Objective-c,C ++还是Objective-C ++?我问,因为你指的是用c ++语法(::)而不是obj-c( - )的方法,而且我对c ++方面不太好。

通常,如果对象在解除分配(拆除)时有工作要做,则实现-dealloc方法。在那里,您将取消网络请求并释放任何低级资源,如文件句柄。当没有对实例的更多引用并且它已准备好解除分配时,obj-c运行时将自动调用此方法 - 您不应手动调用此方法。

普遍接受的模式是当你完成它并让运行时处理解除分配对象时,取消对你的对象的任何强引用。如果您在任何地方都遵循该模式(网络,文件系统访问,GPS等),那么它很容易使用。