ASIHTTP这个三方库是现在网络请求通用的做法,实现简单,功能强大。
初学的时候有很长一段时间只会用同步请求,不过那时候请求的数据都不大,所以也没有什么大问题。
但是到后面请求的数据越来越大之后就发现程序越来越不对劲,一做数据请求就整个卡死不能动了。后面尝试做异步请求,但是有时就会在这句代码发生内存泄露警告
- (void)requestStarted
{
if ([self error] || [self mainRequest]) {
return;
}
//就是这句会报错
if (delegate && [delegate respondsToSelector:didStartSelector]) {
[delegate performSelector:didStartSelector withObject:self];
}
#if NS_BLOCKS_AVAILABLE
if(startedBlock){
startedBlock();
}
#endif
if (queue && [queue respondsToSelector:@selector(requestStarted:)]) {
[queue performSelector:@selector(requestStarted:) withObject:self];
}
}
最神奇的是这个bug还有随机性,有时可以直接运行,有时就会奔溃,弄得焦头烂额。
后面过了很久忘了是在哪里看到了解决方法,说是request的delegate释放出现了问题,要么将delegate释放重新定义,要么就不用delegate。
释放delegate最近在网上看,貌似别人是这么写的,要是不对的话请告诉我。
- (void)dealloc
{
[request clearDelegatesAndCancel];
[request release];
...
[super dealloc];
}
而我当时是这么写的
//不写request.delegate = self;用下面的Block代替
[request setComletionBlock:^{
//把原先写在requestFinished里的代码改写在这里
NSString* restr = [request responseString];
NSData* data = [request responseData];
NSLog(@"%@",restr);
}];
[request setFailedBlock:^{
NSError* err = [request error];
NSLog(@"err = %@",err.userInfo);
}];
用Block避开了delegate,那个bug也没有出现过了。