我正在使用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/

10-13 01:49