【问题标题】:ASIHTTP - Leave the view and get EXC_BAD_ACCESSASIHTTP - 离开视图并获取 EXC_BAD_ACCESS
【发布时间】:2011-06-13 01:19:24
【问题描述】:

我正在使用 ASIHTTP 以我的视图控制器作为委托运行一个 http 请求,如果用户在请求完成之前离开视图控制器,我会在 ASIHTTP 代码中得到一个 EXC_BAD_ACCESS 正在执行 if ( 委托 .. .)

在我的视图控制器 dealloc 中我必须做些什么吗?如果用户离开,我想简单地放弃请求。

【问题讨论】:

  • 这通常是您的代码有问题。发布一些,我们将尝试破译问题。
  • 如果发生崩溃,则有回溯或崩溃日志。发布它。

标签: iphone asihttprequest


【解决方案1】:

出现此类问题的最常见原因是 ASIHTTPRequest 对象仍然处于活动状态,并且其委托字段指向的对象现在已被销毁。 EXC_BAD_ACCESS 将在 ASIHTTPRequest 尝试告诉代理请求已完成等等时发生。

你的dealloc方法作为asihttprequest委托的对象应该有:

request.delegate = nil;
[request cancel]
[request release]

如果您一次只有一个请求处于活动状态,则在开始新请求的任何地方都必须有相同的代码,以确保正确取消任何先前的请求。

如果您有多个处于活动状态的请求,您将需要跟踪所有请求,并取消所有请求的委托并将其归零。

作为参考,我已经使用 ASIHTTPRequest 大约 18 个月了,并且为与取消请求相关的困难竞争条件提供了一些修复。

【讨论】:

  • 您不必释放请求。
  • @peterp 不确定我是否理解:如果您不释放请求,您将获得内存泄漏。 (并且您必须保留该请求,否则您无法保证它仍然存在,您可以在您的 dealloc 方法中取消。)
  • @josephH 您不必保留它,因为您不必保证它应该在您的 dealloc 方法中。如果它不在你的 dealloc 方法中,那么你就没有问题了。
  • @peterp 问题是您需要确保在调用 dealloc 后它绝对不会调用您的委托,就好像这样做会导致崩溃一样。保证这一点的最简单方法是保留请求并在 dealloc 中取消(并释放)它。如果你不保留它,取消调用可能会调用一个已经释放的对象(如果请求已经完成),这将导致崩溃。如果您有更好的方法,请发布您自己的答案!
  • 我什至没有保留请求。我从未考虑过用户可以在请求完成之前进入视图并离开。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多