【发布时间】:2012-12-10 21:31:03
【问题描述】:
我正在使用块来执行与网络相关的任务
当我的UITableViewController 中的块完成时,我想重新加载 tableviewcontroller
__unsafe_unretained UITableView *unretTableView = self.tableview;
[myRequest postWithCompletion:(bool finished) {
[unretTableView reloadData];
}];
这很好,除了如果我在请求完成之前离开(deallocate)UITableViewController,我似乎指向一个已释放的对象(unretTableView)发送到已释放实例的消息 em> 即使在[UITableViewController dealloc] 方法(正在调用)中我设置了self.tableview = nil;
其他细节:
- 无法使用
__weak,我的目标是 iOS 4.3 及更高版本 - 在
UITableViewController的dealloc方法中,我设置了self.tableview = nil - 我不想在您离开页面时取消网络请求,我希望它继续运行。
- 编辑:我也不想在块中保留 self.tableview
谢谢!
【问题讨论】:
-
一堆选项: 1. 切换到委托模式,您有一些对象进行更新,并且 tableview 控制器将其委托设置为指向 tableview 控制器。 2. 使用 NSOperation 进行后台更新,如果控制器离开并且不再需要数据,则让 tableview 控制器取消它。在告诉 tableview 重新加载之前进行操作检查以确保它没有被取消。 3. 使用通知,所以通知中心会告诉tableview什么时候需要重新加载。
-
你使用什么库来进行网络请求?当然最好取消请求,否则您将毫无意义地使用资源
-
谢谢@Rob 虽然委托模式会有所帮助,但如果我使用块,我会处于同样的情况,因为请求可能是排队的许多发布请求之一。我可以遍历 dealloc 并将所有块设置为 nil(与将所有代表设置为 nil)只是想知道是否有更清洁的方法来执行此操作。至于选项 2,我想这将是同一件事,迭代并取消操作。我考虑过通知,但更愿意保留块(如果我可以吃蛋糕的话)
标签: objective-c ios memory-management automatic-ref-counting