Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何处理ViewController被释放,在触发后台线程后,该线程引用现在发布的ViewController?_Iphone_Objective C_Ios_Uiviewcontroller_Sigabrt - Fatal编程技术网

Iphone 如何处理ViewController被释放,在触发后台线程后,该线程引用现在发布的ViewController?

Iphone 如何处理ViewController被释放,在触发后台线程后,该线程引用现在发布的ViewController?,iphone,objective-c,ios,uiviewcontroller,sigabrt,Iphone,Objective C,Ios,Uiviewcontroller,Sigabrt,我有一个ViewController,它被推到NavigationController堆栈上。一旦推送到堆栈上,它就开始下载一些图像,通过downloader对象,该对象负责在后台线程中下载图像。这些图像可能需要几秒钟,甚至可以通过WiFi下载。下载完图像后,downloader对象指示ViewController布局其图像,将新下载的图像放在分页的UIScrollView的后面。但是在此期间,用户可能按下了后退按钮,ViewController现在可能已被释放/解除分配,因此downloade

我有一个ViewController,它被推到NavigationController堆栈上。一旦推送到堆栈上,它就开始下载一些图像,通过downloader对象,该对象负责在后台线程中下载图像。这些图像可能需要几秒钟,甚至可以通过WiFi下载。下载完图像后,downloader对象指示ViewController布局其图像,将新下载的图像放在分页的UIScrollView的后面。但是在此期间,用户可能按下了后退按钮,ViewController现在可能已被释放/解除分配,因此downloader对象将导致SIGABRT错误消息,应用程序将崩溃


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

您最好的选择是使用零化弱引用。当然,对于iOS5.0,这只是一个“弱”参考。但是,如果您的目标是低于iOS 5.0,那么您需要一个定制的解决方案。Mike Ash在文章中描述了一个很好的例子。

您最好的选择是使用零化弱引用。当然,对于iOS5.0,这只是一个“弱”参考。但是,如果您的目标是低于iOS 5.0,那么您需要一个定制的解决方案。Mike Ash在文章中描述了一个很好的例子。

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

在数据加载对象中:

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

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

[[NSNotificationCenter defaultCenter] removeObserver:self];

您甚至可以在viewController的viewDidUnload中添加一个反向通知,告诉数据下载程序取消下载(如果您愿意)。

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

在数据加载对象中:

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

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

[[NSNotificationCenter defaultCenter] removeObserver:self];

您甚至可以在viewController的viewDidUnload中添加一个反向通知,告诉数据下载程序取消下载(如果您愿意)。

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


如果您不能这样做,downloader对象应该有某种委托(可能是您的视图控制器),当您对结果不再感兴趣时(例如,在视图控制器的
dealoc
方法中),可以将其设置为
nil
)。如果您以iOS 5为目标,将弱引用归零也是一个选项,但是再次强调,最好是取消下载
NSURLConnection

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


如果您不能这样做,downloader对象应该有某种委托(可能是您的视图控制器),当您对结果不再感兴趣时(例如,在视图控制器的
dealoc
方法中),可以将其设置为
nil
)。将弱引用归零也是一个选项,如果您以iOS 5为目标,但是再次强调,取消下载会更好,因为在某些情况下,这可能会很有用,但我实际上会将下载的数据存储在数据库中,不管它是否成功显示,因此,终止下载实际上会适得其反-不过,感谢您的提示,在某些情况下使用通知而不是委托可能会很有用。也许在某些情况下这会很有用,但我实际上会将下载的数据存储在数据库中,不管它是否成功显示,因此,终止下载实际上会适得其反——不过,感谢您提供的提示,在某些情况下,使用通知而不是委托可能会很有用。