繁体   English   中英

ASIHTTPRequest popViewControllerAnimated: => 委托 EXEC_BAD_ACCESS

[英]ASIHTTPRequest popViewControllerAnimated: => delegate EXEC_BAD_ACCESS

我将视图 controller 设置为局部变量ASIHTTPFormDataRequest request的委托。

但是,在请求完成之前点击“返回”,弹出并取消分配视图 controller。 因此,当请求完成并将消息-requestDidFinish:发送到现在不存在的委托时,应用程序会因EXEC_BAD_ACECESS异常而崩溃。

如何修复此崩溃?

  1. 我能想到的解决这个问题的一种方法是在导航 controller 弹出它后立即将代理设置为 nil。 但是,如果这是解决方案,我该怎么做? (ARC 的weak引用现在会很好。)

  2. 我能想到的另一种方法是request视图 controller 的实例变量并调用[request clearDelegatesAndCancel]; [request release]; [request clearDelegatesAndCancel]; [request release]; 在视图控制器的dealloc方法中。 这种方法在ASIHTTPRequest 示例代码中进行了概述,但我被告知最好使用请求本地变量而不是实例变量。 而且,这个特定的视图 controller 是一个设置表视图 controller 并且有 13 个开关。 为了自动保存到服务器,每次切换时,每个开关都会创建并发送一个新请求。 如果我制作了 ivars,我必须制作 13 个。那是很多代码!

想法? 想法?

我认为第一个问题是:如果用户在按下开关后按下回,你发生什么? IE。 是否应该取消 http 请求,或者请求到达服务器是否重要? 我现在假设您确实想取消它们,因为您的问题似乎暗示了这一点。

我被告知最好是请求本地变量而不是实例变量

我不确定这是否是个好建议——你几乎总是希望请求不是局部变量,这样你就可以处理这样的情况。

对于您的情况,您可以考虑使用NSOperationQueue

执行此操作的粗略步骤是:

  1. 在您的视图 controller init 中创建一个 NSOperationQueue。
  2. 当您要发出 http 请求时,将其添加到 ASIHTTPRequest 队列而不是调用 startAsynchronous
  3. 在dealloc中,迭代队列中的对象,调用[request clearDelegatesAndCancel]; 对于每一个,然后释放队列。

这应该可以解决崩溃而不需要 13 个 ivars!

我通过保留请求委托来解决这个问题,例如NSURLConnection保留其委托

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM