我有一个远程服务,它异步处理请求。返回数据后,我将刷新本地 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 被销毁时取消它。