我正在使用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
个AsyncImageLoader在cellForRowAtIndexPath
中调用indexPath.row % 6
,因此,如果我不断上下滚动,则使用同一对象一次又一次地调用它,取消请求,因为它们尚未结束。但是我总是最终拥有一个EXC_BAD_ACCESS。根据调用堆栈,它发生在ASIHTTPRequest的
markAsFinished
中,该failWithError
由[self.request cancel]
调用,由loadImageFromURL:
在self.request = nil
中调用。大多数时候,ASIHTTPRequest已被释放(我在它的dealloc中添加了一个NSLog),但是我不知道这怎么可能,因为ASIHTTPRequest似乎抛出了保留,因此取消时不会释放。如果在委托方法中删除,我将没有任何EXC_BAD_ACCESS,但是由于ASIHTTPRequests一直在创建而没有取消分配,因此它们最终根本无法工作。
有人可以告诉我我在做什么错吗?
最佳答案
当遇到EXC_BAD_ACCESS问题时,这意味着您已经发布了一些东西。在大多数情况下,您只需要运行调试器(Command-Y),然后在崩溃时在堆栈跟踪中查看代码的最后一行,以找出哪个对象被过度释放。如果那不起作用,那么您需要turn on zombies并查看释放后再次访问了哪个对象。这几乎总是会指引您正确的方向。
附带说明一下,还有其他一些库可以满足您的需求。我没有使用太多,但看起来至少有潜力。检出:SDWebImage。也许那会给你一些想法。
最好的祝福。
关于iphone - ASIHTTPRequest解除分配和EXC_BAD_ACCESS问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3291834/