Juk*_*rpa 2 iphone exc-bad-access objective-c dealloc asihttprequest
我正在使用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
Run Code Online (Sandbox Code Playgroud)
loadImageFromURL被称为cellForRowAtIndexPath对indexPath.row % 6日AsyncImageLoader,所以如果我继续向上和向下滚动它与同一对象一再呼吁,取消请求,因为它们还没有结束.
但我总是最终拥有一个EXC_BAD_ACCESS.根据调用堆栈,它发生在ASIHTTPRequest的markAsFinished调用中failWithError,由[self.request cancel]in 调用loadImageFromURL:.大部分时间ASIHTTPRequest已经发布了(我在它的dealloc中添加了一个NSLog),但是我没有看到这是如何可能的,因为ASIHTTPRequest似乎抛出了保留因此在取消时它没有被释放.
如果我self.request = nil在委托方法中删除,我没有任何EXC_BAD_ACCESS ,但由于ASIHTTPRequests在没有解除分配的情况下继续创建,它们最终根本不起作用.
有人能告诉我我做错了什么吗?
当您遇到EXC_BAD_ACCESS问题时,这意味着您已经过度发布了某些内容.在大多数情况下,您只需运行调试器(Command-Y)并在崩溃时查看堆栈跟踪中代码的最后一行,以找出哪些对象被过度释放.如果这不起作用,那么你需要打开僵尸,看看它被释放后再次访问哪个对象.这几乎总能指向正确的方向.
作为旁注,还有一些其他库可以做你想要做的事情.我没有多用过这个,但看起来它至少有潜力.退房:SDWebImage.也许这会给你一些想法.
最好的祝福.
| 归档时间: |
|
| 查看次数: |
5664 次 |
| 最近记录: |