使用ASI庫調(diào)用delegata報錯thread 1:exc_bad_access(code=EXC_I386_GPFLT),按照網(wǎng)上的一些經(jīng)驗,將getadata改為nil以后就可以順利通過了。但是有需要接收服務器返回結(jié)果。
情況:項目使用的ASI庫上傳文件,為了根據(jù)結(jié)果做一些后續(xù)的操作,使用了Delegata來接收服務端返回的結(jié)果。代碼如下:
[request setDelegate:self];
//正常
-(void)requestFinished:(ASIHTTPRequest *)request{
? ? NSLog(@"requestFinished");
}
//異常
-(void)requestFailed:(ASIHTTPRequest *)request{
? ? NSLog(@"requestFailed");
}
//接收結(jié)果
-(void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data{
? ? //接收返回結(jié)果
? ? 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"]){
? ? ? ? //需要執(zhí)行的操作
? ? }
}
打完全局斷點程序會顯示崩潰在:
if(delegate &&[delegate respondsToSelector:didStartSelector]){
[delegate performSelector:didStartSelector withObject:self];
}
這就很尷尬了,ASI這個庫已經(jīng)不維護太久了,但是項目用的這個庫我又不得不去看,而且自己水平太菜搞不太清楚核心問題出在哪,只能判斷出問題是出于delegata的。經(jīng)過一番查找資料,終于找到了一種解決方案。把delegata刪除掉,換一種方式來接收返回結(jié)果。代碼如下:
[request setCompletionBlock :^{
? ? ? ? //請求響應結(jié)束,返回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"]){
? ? ? ? ? //需要執(zhí)行的操作
? ? ? ? }
? ? }];
? ? [request setFailedBlock :^{
? ? ? ? //請求響應失敗,返回錯誤信息
? ? ? ? NSError *error =[requesterror];
? ? ? ? NSLog(@"error:%@",[error userInfo]);
? ? }];
然后就順利的跑過了,謝謝這篇古老的帖子(貼在最下邊咯)。
古老的帖子(參考文檔):https://www.2cto.com/kf/201303/195374.html