Я использую массив оболочек 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
th AsyncImageLoader, поэтому, если я продолжаю прокручивать вверх и вниз, он вызывается снова и снова с одним и тем же объектом, отменяя запросы, поскольку они еще не закончены.
Но я всегда получаю EXC_BAD_ACCESS. Согласно стеку вызовов, это происходит в ASIHTTPRequest markAsFinished
, вызывается failWithError
, вызывается [self.request cancel]
в loadImageFromURL:
. Большую часть времени ASIHTTPRequest уже был выпущен (я добавил NSLog в его Dealloc), но я не понимаю, как это возможно, поскольку ASIHTTPRequest, кажется, выдает сохранения, поэтому он не освобождается при отмене.
У меня нет EXC_BAD_ACCESS, если я удаляю self.request = nil
в методах делегата, но поскольку ASIHTTPRequests продолжают создаваться без освобождения, они в конечном итоге вообще не работают.
Может ли кто-нибудь сказать мне, что я делаю неправильно?