2012-05-18 37 views
1

我有一个ViewController被推到NavigationController堆栈。一旦它被推入堆栈,它就开始下载一些图像,通过一个下载器对象来负责下载后台线程中的图像。图像可能需要几秒钟,即使通过WiFi下载。当图像完成下载时,下载器对象指示ViewController布置其图像,将新下载的图像放到分页的UIScrollView的背面。然而,在这段时间内,用户可能已经按下“后退”按钮,并且ViewController现在可能已被释放/解除分配,因此下载器对象将导致SIGABRT错误消息,并且应用程序将崩溃。如何处理ViewController被释放后,射出背景线程,现在释放ViewController?

我应该如何处理这种情况?有没有办法检查释放/释放的实例?或者以某种方式来捕捉错误和日志,然后忽略它呢?

回答

3

最好的办法是使用调零弱参考。当然,对于iOS 5.0,这只是一个“弱”的参考。但是,如果你的目标是iOS 5.0以下,那么你需要一个自定义的解决方案。文章中有一篇由Mike Ash在this文章中描述的很好的文章。

1

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

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshMyLayout) name:@"allDataLoaded" object:nil]; 
在您的视图控制器的dealloc

[[NSNotificationCenter defaultCenter] postNotificationName:@"allDataLoaded" object:nil]; 
在您的视图控制器的viewDidLoad

在数据加载对象

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

你甚至可以把一个反向通知从你viewController的viewDidUnload中告诉数据下载者取消下载广告(如果你想)。

+0

也许在某些情况下,这将会很有用,但我实际上将下载的数据存储在数据库中,无论它是否显示成功,因此终止下载实际上会反作用 - 感谢提示,尽管使用通知而不是代表可能会在某些时候有用。 –

0

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

如果你不能做到这一点,下载对象都应该拥有某种委托的(你的看法可能是控制器),当你不再感兴趣的结果(例如,在您的视图控制器的dealloc,你可以设置为nil方法)。如果您定位iOS 5,则清零弱引用也是一种选择,但同样,取消下载NSURLConnection会更好。

相关问题