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
th AsyncImageLoader に対して呼び出されるcellForRowAtIndexPath
ため、indexPath.row % 6
上下にスクロールし続けると、同じオブジェクトで何度も呼び出され、まだ終わっていないのでリクエストがキャンセルされます。
しかし、私は常に EXC_BAD_ACCESS を持っています。コール スタックによると、ASIHTTPRequest のmarkAsFinished
で呼び出され、 infailWithError
で呼び出されます。ほとんどの場合、ASIHTTPRequest は既に解放されています (dealloc に NSLog を追加しました) が、ASIHTTPRequest が保持をスローしているように見えるため、キャンセル中に解放されないため、これがどのように可能かわかりません。[self.request cancel]
loadImageFromURL:
デリゲート メソッドを削除すると EXC_BAD_ACCESS はありませんが、ASIHTTPRequests はself.request = nil
割り当てを解除せずに作成され続けるため、まったく機能しなくなります。
誰かが私が間違っていることを教えてもらえますか?