我正在使用一组 ASIHTTPRequest 包装器 (AsyncImageLoader) 来下载 UITableView 中单元格的图像。
我在处理 ASIHTTPRequests 生命周期时遇到问题。如果我释放它们,如果我在他们尝试加载图像时继续上下滚动,我最终会得到 EXC_BAD_ACCESS。
这是我的包装器的样子。self.request
具有保留属性,targetCell
是我要放入图像的单元格:
@implementation AsyncImageLoader
- (void)loadImageFromURL:(NSString*)fileName target:(ResultTableViewCell*)targetCell {
// check for cached images, etc
NSURL* url = [NSURL URLWithString:fileName];
[self.request cancel];
self.request = [ASIHTTPRequest requestWithURL:url];
self.request.delegate = self;
}
- (void)startLoading {
[self.request startAsynchronous];
}
- (void)cancel {
[self.request cancel];
self.request = nil;
}
- (void)requestFinished:(ASIHTTPRequest*)requestDone {
// cache image, set cell image...
self.request = nil;
}
- (void)requestFailed:(ASIHTTPRequest*)requestDone {
// handle answer as well
self.request = nil;
}
@end
loadImageFromURL
为cellForRowAtIndexPath
第indexPath.row % 6
一个 AsyncImageLoader 调用,所以如果我继续向上和向下滚动,它会用同一个对象一次又一次地调用,取消请求,因为它们还没有结束。
但我最终总是有一个 EXC_BAD_ACCESS。根据调用堆栈,它发生在 ASIHTTPRequest 中markAsFinished
,由 in 调用failWithError
,由[self.request cancel]
in调用loadImageFromURL:
。大多数时候 ASIHTTPRequest 已经发布(我在它的 dealloc 中添加了一个 NSLog),但我不明白这是怎么可能的,因为 ASIHTTPRequest 似乎抛出了保留,因此在取消时它不会被释放。
如果我在委托方法中删除,我没有任何 EXC_BAD_ACCESS self.request = nil
,但是由于 ASIHTTPRequests 在没有释放的情况下继续创建,它们最终根本不起作用。
有人可以告诉我我做错了什么吗?