如何停止ASIHTTPRequest(使用ARC)?

时间:2011-11-03 17:23:00

标签: ios ios4 ios5 asihttprequest

我使用ARC,ASIHTTPRequest-Files我有特殊的编译器链接器标志,因此它们不使用ARC。现在我创建一个ASIHTTPRequest,如下所示:

  

...

     

@property(非原子,强)ASIFormDataRequest *请求;

     

@syntesize request

     

...

self.request = [[ASIFormDataRequest alloc]initWithURL:[NSURL URLWithString:API3]];
self.request.delegate=self;
[self.request startAsynchronous];

如果视图在请求完成之前关闭,我会得到一个EXEC_BAD_ACCESS,因为视图已经被释放。如果我打电话给

  

[self.request clearDelegateAndCancel]

请求没有停止,应用程序仍然继续崩溃。 我试图在主线程上调用clearDelegateAndCancel并使用performSelector afterDelay,但结果相同。 当我启用ASIHTTPRequest的LOG输出时,我看到方法被调用,并且ASIHTTPRequest.m中的内部函数[self cancel]被调用,但是请求没有停止,我看到它是因为网络活动指示器

有没有其他人有这个问题,或者知道如何解决?

2 个答案:

答案 0 :(得分:2)

这可能是因为您的viewcontroller(即ASI委托)不是由ASI作为弧弱指针管理的,因此在取消分配视图控制器时不会自动更新为nil。 你应该在arc viewcontroller中实现dealloc,以防止ASI回调不存在的委托(viewcontroller)

- (void)dealloc
{
   [request clearDelegatesAndCancel];
}

甚至viewDidUnload都应取消ASI请求归零,因此代理

- (void)viewDidUnload
{
    [self.request clearDelegatesAndCancel];
    self.request = nil;

    [super viewDidUnload];
}

答案 1 :(得分:2)

您可以为该一个类禁用ARC

迁移项目以使用ARC时, -fobjc-arc 编译器标志将设置为所有Objective-C源文件的默认值。您可以使用该类的 -fno-objc-arc 编译器标志为特定类禁用ARC

在Xcode中,转到目标Build Phases tab>打开Compile Sources group以显示源文件列表>双击要为其设置标志的文件>在弹出式面板中输入 -fno-objc-arc ,然后点击完成。