代码之家  ›  专栏  ›  技术社区  ›  rickharrison

从视图堆栈弹出uiviewcontroller,nsurlconnection导致应用程序崩溃

  •  3
  • rickharrison  · 技术社区  · 14 年前

    我在推 UIViewController 上了 UINavigationController . 这个视图控制器立即开始下载XML提要,然后解析它。但是,如果在下载完成之前按后退按钮,则会导致exc_bad_访问崩溃。撞毁它的那条线在里面 parserDidEndDocument 这条线是:

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

    我假设它崩溃了,因为它试图访问self.delegate,而self.delegate不再被分配。我该怎么解决这个问题?

    另外,我将在 modelDidFinishParsing 方法。如果这个模型永远达不到这个方法,我将如何发布它。

    2 回复  |  直到 13 年前
        1
  •  1
  •   Andiih    14 年前

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

    实现这一点的最佳方法是将它们传递给需要它们的ViewController(而不是ViewController“期望”AppDelegate具有这样的对象准备就绪并等待),依赖注入。

    这些对象在完成时以某种方式更新我的模型,如果需要,我使用nsnotifications来宣布它们完成了。这使我与以前试图在视图中取消或交换代理的混乱状态隔离开来,这样会消失等,以避免您遇到的问题。

        2
  •  0
  •   orj    13 年前

    您的应用程序崩溃的原因可能是因为nsurlconnection保留了它的委托(这样它就可以可靠地回叫它),但这个委托具有弱引用的对象已经被释放。

    例如,在您的情况下,当弹出视图控制器时,self.delegate指向的对象可能已被释放,但delegate属性尚未清除(设置为nil)。

    解决问题的方法是在从导航堆栈中弹出uiviewController子类时,在适当的时间清除self.delegate。

    注: 对于可可类来说,保留学员不是常见的行为。在发生与标准实践相反的情况下,应将其记录在案(参见nsurlconnection文档)。