如果视图控制器不再存在,则在异步调用中出错

Getting error in async calls if the View Controller is no longer exists

我调用了一个远程服务,它异步处理请求。当数据返回时,我会刷新我的本地 UI.

但有时当视图消失并且异步调用仍在队列中时,应用程序会崩溃并出现错误 EXEC BAD ACCESS(即对象已被释放)即

My app crashes when the service returns but the ViewController is disposed.

主要是我在调用 [delegate respondsToSelector:@selector (methodName:)] 时遇到错误,因为视图控制器不再存在。

可能我需要取消我在 viewWillDisappear 中的所有异步调用(正在运行或在队列中等待)。但是我无法取消正在运行的呼叫。

我已经尝试了 this 但是在 viewWillDisappear 中我的 self.navigationController.delegate 已经是零了。

编辑:

服务调用方法:

{
    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{

        ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@“%@method_name”,Base_URL]]];
        [request setRequestMethod:@"POST"];

        [request setTimeOutSeconds:600];
        [request setPostValue:userID forKey:@“id”];

        [request setDelegate:self];
        [request setDidFinishSelector:@selector(requestFinished:)];
        [request setDidFailSelector:@selector(requestFailed:)];

        [request startAsynchronous];

    }];
    [operationQueue addOperation:operation];
}

还有我的 requestFinished 方法(我的应用崩溃了)

-(void)requestFinished:(ASIHTTPRequest *)request
{
    // some stuff
    // It's working fine when I normally run my app but fails when I rapidly changes the View Controller.
    if ([delegate respondsToSelector:@selector(gotResponseData:)]) // Here my app crashes
   {
       [delegate gotResponseData:responseDict];
    }
}

.h 文件中的委托属性:

@property (nonatomic,assign)id <protocolName>delegate;

主要是当我在 View Controller 之间快速切换时,这个应用程序崩溃了。

如果需要,我会编辑我的问题。

请多多指导。

在您的块操作中,您应该使用对 self 的弱引用,以便 if/when 释放 self 操作不会调用无效引用。

事实上,您实际上不应该需要该操作,因为您正在操作中启动一个异步进程。

你的委托 属性 in self 也应该很弱,因为你的代码表明问题是委托使用了不安全的未保留方法(因为你说崩溃发生的地方)。

通常你只会有一个来自 self 的请求 运行 所以你应该维护对请求的引用并在 self 被销毁时取消它。