ASIHTTPRequest dealloc和EXC_BAD_ACCESS问题

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被称为cellForRowAtIndexPathindexPath.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在没有解除分配的情况下继续创建,它们最终根本不起作用.

有人能告诉我我做错了什么吗?

Mat*_*ong 5

当您遇到EXC_BAD_ACCESS问题时,这意味着您已经过度发布了某些内容.在大多数情况下,您只需运行调试器(Command-Y)并在崩溃时查看堆栈跟踪中代码的最后一行,以找出哪些对象被过度释放.如果这不起作用,那么你需要打开僵尸,看看它被释放后再次访问哪个对象.这几乎总能指向正确的方向.

作为旁注,还有一些其他库可以做你想要做的事情.我没有多用过这个,但看起来它至少有潜力.退房:SDWebImage.也许这会给你一些想法.

最好的祝福.