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

时间:2010-05-23 17:59:31

标签: iphone uiviewcontroller uinavigationcontroller nsurlconnection

我正在将UIViewController推到UINavigationController。此视图控制器立即开始下载xml源,然后解析它。但是,如果在完成下载之前点击后退按钮,并且与EXC_BAD_ACCESS崩溃。崩溃的行在parserDidEndDocument,并且是这一行:

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

我认为它正在崩溃,因为它正在尝试访问未分配的self.delegate。我该如何解决这个问题?

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

2 个答案:

答案 0 :(得分:1)

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

执行此操作的最佳方法是将它们传递给需要它们的viewControllers(而不是viewController“期望”appDelegate使这样的对象准备就绪并等待) - 依赖注入。

这些对象在完成后会以某种方式更新我的模型,如果需要,我会使用NSNotifications来宣布它们已完成。这使我与以前在viewWillDisappear中尝试取消或交换委托的混乱隔离,以避免遇到的问题。

答案 1 :(得分:0)

你的应用程序崩溃的原因可能是因为NSURLConnection保留了它的委托(所以它可以可靠地回调它),但是这个委托有弱引用的对象已被释放。

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

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

注意:保留委托对于Cocoa类来说并不常见。如果它发生与标准实践相反的情况,则会记录(参见NSURLConnection文档)。