저는 ASIHTTPRequest 래퍼 (AsyncImageLoader) 배열을 사용하여 UITableView의 셀 이미지를 다운로드하고 있습니다.ASIHTTPRequest dealloc 및 EXC_BAD_ACCESS 문제
평생 ASIHTTPRequests 처리 문제가 있습니다. 그들이 이미지를로드하려고 시도하는 동안 위아래로 스크롤을 계속하면 EXC_BAD_ACCESS가 생겨납니다.
내 래퍼의 모양은 다음과 같습니다. 다시하고 다시 불려 아래로 I가 스크롤을 계속하는 경우 있도록 그리고, indexPath.row % 6
번째 AsyncImageLoader에 대한 cellForRowAtIndexPath
에서 호출
@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
: self.request
는 targetCell
내가의 이미지를 넣을 세포이며, 속성을 유지있다 동일한 객체, 아직 끝나지 않은 요청을 취소합니다.
하지만 항상 EXC_BAD_ACCESS가 있습니다. 호출 스택에 따르면 ASIHTTPRequest의 markAsFinished
에서 에 의해 호출되고 [self.request cancel]
에 의해 호출되는 loadImageFromURL:
에서 발생합니다. 대부분 ASIHTTPRequest가 이미 릴리스되었습니다 (NSLog를 dealloc에 추가했습니다). 그러나 ASIHTTPRequest가 유지를 throw하여 취소하는 동안 해제되지 않는 것처럼 이것이 가능한지는 알 수 없습니다.
대리자 메서드에서 self.request = nil
을 제거하면 EXC_BAD_ACCESS가 없지만 할당 해제없이 ASIHTTPRequests가 계속 만들어 지므로 결국 작동하지 않습니다.
누군가 내가 뭘 잘못하고 있다고 말할 수 있습니까?
, 그건 당신이 잘못하고있는 일입니다. 자신을 발견 한 것처럼 위임 메서드에서 요청을 nil로 설정하는 것은 좋은 생각이 아닙니다. 올바른 위치는 - (void)입니다. viewDidUnload –