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



我有一个远程服务,它异步处理请求。返回数据后,我将刷新本地 UI。

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

当服务返回但视图控制器已释放时,我的应用程序崩溃。

主要是我在调用[delegate respondsToSelector:@selector (methodName:)]时出错,在视图控制器不再存在之后。

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

我已经尝试过了,但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;

主要是当我在视图控制器之间快速切换时,此应用程序崩溃。

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

请给我一些指导。

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

实际上

,您实际上不需要该操作,因为无论如何您都在操作中启动异步进程。

self 中的委托属性也应该很弱,因为您的代码指示问题是委托正在使用不安全的未保留方法(因为您说崩溃发生的位置)。

通常,您只会有一个从 self 运行的请求,因此您应该维护对该请求的引用,并在 self 被销毁时取消它。

最新更新