使用ASI库调用delegata报错thread 1:exc_b

2018-04-13  本文已影响0人  墨_辰

使用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

上一篇下一篇

猜你喜欢

热点阅读