Утечка памяти ASIHTTPRequest
У меня есть проект iOS, в котором я использую ARC в своих классах, но отключил ARC в других библиотеках, таких как ASIHTTPRequest
.
Я получаю огромные утечки памяти, используя приведенный ниже код, чтобы получить изображение с веб-сервера:
-(void)buildPhotoView {
self.photoLibView.hidden = NO;
NSString *assetPathStr = [self.cellData objectForKey:@"AssetThumbPath"];
// get the thumbnail image of the ocPHOTOALBUM from the server and populate the UIImageViews
NSURL *imageURL = [NSURL URLWithString:assetPathStr];
__block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:imageURL];
__unsafe_unretained ASIHTTPRequest *weakRequest = request;
[weakRequest setCompletionBlock:^{
// put image into imageView when request complete
NSData *responseData = [weakRequest responseData];
UIImage *photoAlbumImage = [[UIImage alloc] initWithData:responseData];
self.photo1ImageView.image = photoAlbumImage;
}];
[weakRequest setFailedBlock:^{
NSError *error = [request error];
NSLog(@"error geting file: %@", error);
}];
[weakRequest startAsynchronous];
}
Я изменил пример кода с кодовой страницы примера ASIHTTPRequest
, чтобы исключить предупреждения компилятора в Xcode.
Как я могу избавиться от этих утечек памяти? Кажется, я получаю их только при использовании блоков.
Ответы
Ответ 1
Вы ссылаетесь на неверную переменную запроса из блока завершения. Вы должны ссылаться на request
в блоке (почему вы объявляете его с идентификатором __block
). На самом деле вам не нужно вообще объявлять weakRequest
.
Если вы хотите, чтобы запрос хранился в памяти, сохраните его в @property (retain)
в своем классе (возможно, с методом buildPhotoView
).