Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.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 UIViewController从视图堆栈弹出,NSURLConnection使应用程序崩溃_Iphone_Uiviewcontroller_Uinavigationcontroller_Nsurlconnection - Fatal编程技术网

Iphone UIViewController从视图堆栈弹出,NSURLConnection使应用程序崩溃

Iphone UIViewController从视图堆栈弹出,NSURLConnection使应用程序崩溃,iphone,uiviewcontroller,uinavigationcontroller,nsurlconnection,Iphone,Uiviewcontroller,Uinavigationcontroller,Nsurlconnection,我正在将UIViewController推到UINavigationController上。该视图控制器立即开始下载xml提要,然后对其进行解析。但是,如果在下载完成之前点击后退按钮,EXC_BAD_访问崩溃。正在崩溃的行位于parserDidEndDocument中,是这一行: if (self.delegate && [self.delegate conformsToProtocol:@protocol(ModelDelegate)]) [self.delegate mode

我正在将
UIViewController
推到
UINavigationController
上。该视图控制器立即开始下载xml提要,然后对其进行解析。但是,如果在下载完成之前点击后退按钮,EXC_BAD_访问崩溃。正在崩溃的行位于
parserDidEndDocument
中,是这一行:

if (self.delegate && [self.delegate conformsToProtocol:@protocol(ModelDelegate)]) [self.delegate modelDidFinishParsing:self];
我认为它崩溃是因为它试图访问不再分配的self.delegate。我该怎么做


另外,我将在
modeldiffinishparsing
方法中释放模型对象。如果此模型从未达到此方法,我将如何释放它。

我在AppDelegate中设置对象来处理我的下载(以及其他异步或长时间运行的任务),然后根据需要从各种控制器触发它们。这样,它们就被拥有并在应用程序的整个生命周期中都具有持久性

最好的方法是将它们传递给需要它们的viewController(而不是viewController“期望”appDelegate具有这样或那样的对象就绪并等待)-依赖项注入


这些对象完成后会以某种方式更新我的模型,如果需要,我会使用NSNotifications来宣布它们完成。这将我与以前尝试取消或交换ViewWillEnglish中的代理时陷入的混乱隔离开来,以避免您遇到的问题。

您的应用程序崩溃的原因可能是因为NSURLConnection保留了它的代理(因此它可以可靠地回叫它)但此委托具有弱引用的对象已被解除分配

例如,在您的情况下,当弹出视图控制器时,self.delegate指向的内容可能已解除分配,但委托属性尚未清除(设置为nil)

问题的解决方案是在从导航堆栈弹出UIViewController子类时,在适当的时间清除(nil)self.delegate

注意:保留代理不是Cocoa类的常见行为。如果发生与标准实践相反的情况,则会对其进行记录(参见NSURLConnection文档)