1

我有一个 ViewController 被推送到 NavigationController 堆栈上。一旦它被推入堆栈,它就开始通过下载器对象下载一些图像,该对象负责在后台线程中下载图像。即使通过 WiFi 下载图像也可能需要几秒钟的时间。当图像下载完成后,下载器对象指示 ViewController 布局其图像,将新下载的图像放在分页 UIScrollView 的后面。然而,在此期间,用户可能按下了返回按钮,而 ViewController 现在可能已被释放/解除分配,因此下载器对象将导致 SIGABRT 错误消息并且应用程序将崩溃。

我应该如何处理这种情况?有什么方法可以检查释放/解除分配的实例吗?或者某种方式来捕获错误并记录,然后忽略,它?

4

3 回答 3

3

您最好的选择是使用归零弱参考。当然,对于 iOS 5.0,这只是一个“弱”的参考。但是,如果您的目标是低于 iOS 5.0,那么您需要一个自定义解决方案。Mike Ash 在本文中有一个很好的描述。

于 2012-05-18T07:27:57.760 回答
1

也许您可以通过使用通知来避免这个问题?它不是您的下载器对象引用 viewController,而是发布一个通知, viewController(如果已加载)会响应该通知。

在您的数据加载对象中:

[[NSNotificationCenter defaultCenter] postNotificationName:@"allDataLoaded" object:nil];

在您的视图控制器 viewDidLoad 中:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshMyLayout) name:@"allDataLoaded" object:nil];

在您的视图控制器 dealloc 中:

[[NSNotificationCenter defaultCenter] removeObserver:self];

您甚至可以在 viewDidUnload 中放置来自 viewController 的反向通知,告诉数据下载器取消下载(如果需要)。

于 2012-05-18T09:54:09.863 回答
0

最好是在不再需要结果后取消下载。这可以防止不必要的数据流量和内存消耗。

如果你不能这样做,下载器对象应该有某种委托(可能是你的视图控制器),nil当你不再对结果感兴趣时(例如在你的视图控制器的dealloc方法中)你可以设置它。归零弱引用也是一种选择,如果你的目标是 iOS 5,但同样,取消下载会更好NSURLConnection

于 2012-05-18T10:27:44.127 回答