在我们的应用程序中,我们有几个 UITableView,它们具有网络支持的数据源,实际填充这些数据源可能需要一些时间。以下是通常发生的情况:
- 用户触发 View 。
- 在 viewDidLoad 中,创建 View 的数据源。
- 模型的 -load 方法被调用
- 模型发出网络请求以获取一些数据 ...
- 在请求完成之前,用户退出 View 。
- 调用 View 的 ViewWillDisappear、ViewDidDisappear、ViewDidUnload 和 dealloc 方法。
- 请求完成。不幸的是,所有或部分表格 View 都消失了,因此造成了严重破坏。
因此,我们的解决方案是正确地“拆除”数据源并取消所有未完成的网络请求,这样就不会发生这种情况。我的问题是:
拆除数据源的“正确”方法是什么?您是否只是丢失了对它的所有引用,并使用 -dealloc 取消未完成的网络请求?
你应该在哪里拆掉它?在 ViewDidUnload?释放?
同样的两个问题实际上也适用于模型:拆解它的正确方法是什么?什么时候?
请注意,这不仅适用于网络请求:我们还有另一个使用地理定位的 View ,有时在调用地理定位完成 block 时,它应该更新的 View 早已消失。
谢谢!
附言附加问题:
- 对于 UITableView,是否有可能在调用 UITableView 的 -dealloc 之前取消分配 View 中的行?如果它们在,比方说,ViewWillDisappear 时间被释放,并且请求恰好在此之后完成,但在 -dealloc 之前,那么如果请求恰好尝试更新 UITableView 行,则会发生严重破坏。
这有意义吗?
最佳答案
您使用的是 Objective-c、C++ 还是 Objective-C++?我问是因为您指的是使用 c++ 语法 (::) 而不是 obj-c (-) 的方法,而且我不擅长 c++ 方面。
如果您的对象在被释放(拆除)时有工作要做,通常您会实现 -dealloc
方法。在那里你可以取消网络请求并释放任何低级资源,如文件句柄。当不再有对该实例的引用并且它已准备好释放它时,obj-c 运行时将自动调用此方法 - 您不应手动调用此方法。
普遍接受的模式是在您完成对对象的所有强引用后将其置零,并让运行时处理释放它。如果您在任何地方(网络、文件系统访问、GPS 等)都遵循该模式,那么使用它会非常容易。
关于ios - 拆除 UITableViewDataSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18617931/