我使用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]被调用,但是请求没有停止,我看到它是因为网络活动指示器
有没有其他人有这个问题,或者知道如何解决?
答案 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 ,然后点击完成。