3

我推UIViewControllerUINavigationController。这个视图控制器立即开始下载一个XML feed,然后解析它。但是,如果在完成下载之前点击后退按钮,并且使用EXC_BAD_ACCESS进行崩溃。被撞毁它的线路是parserDidEndDocument,是这一行:的UIViewController从视图堆栈中弹出和NSURLConnection的崩溃应用

if (self.delegate && [self.delegate conformsToProtocol:@protocol(ModelDelegate)]) [self.delegate modelDidFinishParsing:self]; 

我认为它崩溃,因为它试图访问其不再被分配self.delegate。我如何解决这个问题?

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

回答

1

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

做到这一点的最好方法是将它们传递给需要它们的viewControllers(而不是viewController“期待”appDelegate有这样一个对象准备好并等待) - 依赖注入。

这些对象更新我的模型在某种程度上,当他们完成,如果我需要,我用NSNotifications宣布他们这样做。这使我从我曾经尝试取消或交换委托在viewWillDisappear等混乱的混乱,以避免您遇到的问题类型。

0

您的应用程序崩溃的原因可能是因为NSURLConnection的保留其委托(这样它可以可靠地打电话回去吧),但反对该委托具有弱引用已被释放。

也就是说,在你的情况可能已经在视图控制器被弹出释放什么self.delegate点,但委托财产没有被清除(设置为无)。

的解决问题的方法是清除(无)self.delegate在当UIViewController子类被弹出导航堆栈的适当时间。

备注:保留委托对于Cocoa类来说不是常见的行为。在发生与标准实践相反的情况下,将其记录下来(参见NSURLConnection文档)。

相关问题