使用ASI库调用delegata报错thread 1:exc_bad_access(code=EXC_I386_GPFLT),按照网上的一些经验,将getadata改为nil以后就可以顺利通过了。但是有需要接收服务器返回结果。
情况:项目使用的ASI库上传文件,为了根据结果做一些后续的操作,使用了Delegata来接收服务端返回的结果。代码如下:
[request setDelegate:self];
//正常
-(void)requestFinished:(ASIHTTPRequest *)request{
NSLog(@"requestFinished");
}
//异常
-(void)requestFailed:(ASIHTTPRequest *)request{
NSLog(@"requestFailed");
}
//接收结果
-(void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data{
//接收返回结果
NSString* recvData =[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
//NSString -> NSDictionary
NSData *JSONData =[recvData dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *responseJSON =[NSJSONSerialization JSONObjectWithData:JSONData options:NSJSONReadingMutableLeaves error:nil];
if([[responseJSON objectForKey:@"code"]isEqualToString:@"200"]){
//需要执行的操作
}
}
打完全局断点程序会显示崩溃在:
if(delegate &&[delegate respondsToSelector:didStartSelector]){
[delegate performSelector:didStartSelector withObject:self];
}
这就很尴尬了,ASI这个库已经不维护太久了,但是项目用的这个库我又不得不去看,而且自己水平太菜搞不太清楚核心问题出在哪,只能判断出问题是出于delegata的。经过一番查找资料,终于找到了一种解决方案。把delegata删除掉,换一种方式来接收返回结果。代码如下:
[request setCompletionBlock :^{
//请求响应结束,返回responseString
NSString *recvData =[requestresponseString];//NSData *responseData =[request responseData];
NSLog(@"%@",recvData);
NSData *JSONData =[recvData dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *responseJSON =[NSJSONSerialization JSONObjectWithData:JSONData options:NSJSONReadingMutableLeaves error:nil];
if([[responseJSON objectForKey:@"code"]isEqualToString:@"200"]){
//需要执行的操作
}
}];
[request setFailedBlock :^{
//请求响应失败,返回错误信息
NSError *error =[requesterror];
NSLog(@"error:%@",[error userInfo]);
}];
然后就顺利的跑过了,谢谢这篇古老的帖子(贴在最下边咯)。
古老的帖子(参考文档):https://www.2cto.com/kf/201303/195374.html