2012-07-03 3 views
1

У меня есть следующий код для загрузки изображения:ASIHTTPRequest completionBlock + ARC

imageRequest = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:magazineItem.contentURL]]; 
    __weak ASIHTTPRequest *weakRequest = imageRequest; 

    __block typeof (self) bself = self; 
    [imageRequest setCompletionBlock:^{ 
    if (weakRequest.responseStatusCode == 200) { 
     bself.imageData = weakRequest.responseData; 
     [[DataAccessLayer sharedInstance] storeTemporaryContentData:bself.imageData url:magazineItem.contentURL]; 
     bself.contentImage = [UIImage imageWithData:bself.imageData]; 
     if (bself.contentImage != nil) { 
     if (bself.magazineItem.presentationStyle.intValue != -1) { 
      [bself setPresentationStyle:bself.magazineItem.presentationStyle.intValue]; 
     } 
     else { 
      [bself setPresentationStyleForImage:bself.contentImage]; 
     } 
     } 
     else 
     [bself.delegate contentItemViewUnavailable:bself]; 
    } 
    else { 
     [bself.delegate contentItemViewUnavailable:bself]; 
    } 
    }]; 

    [imageRequest setFailedBlock:^{ 
    if (weakRequest.error.code == 4) 
     return; 
    [bself.delegate contentItemViewUnavailable:bself]; 
    }]; 

    [imageRequest startAsynchronous]; 

И хотя я использую __block typeof (self) идентификатор, чтобы передать себя в блок, он по-прежнему получает удерживаемое. Я также попробовал __weak MyClassName *bself = self;, и он все еще попадает в цикл сохранения. Кажется, я что-то пропустил, может кто-нибудь заполнить меня тем, что я делаю неправильно?

Для справки imageRequest является __strong iVar в моей категории файлов .m.

Заранее спасибо.

+0

ли вы установили imageRequest сильный? @propert (неатомный, сильный) ASIHTTPRequest * imageRequest; – janusbalatbat

+0

Да, iVar по умолчанию сильно, но я использую другой запрос как слабую ссылку на сильную, сохраняя ее в памяти для дальнейших операций, таких как cancel. – Eugene

ответ

1

попробовать

__block __unsafe_unretained typeof (self) bself = self; 

- EDIT -

комментарий, который на самом деле решается вопрос

когда экранным Ивар, сделать это с помощью bself.property. Если вы сразу получите доступ к своим иварам, он получит цикл удержания.

+0

Компилятор сообщает об ошибке: «Тип« typeof (self) »(aka« MyClass * const __strong ») уже имеет атрибуты воспитания, установленные на нем» – Eugene

+0

change typeof (self) с MyClassName * – javieralog

+0

Изменено, как вы предложили. Класс по-прежнему переходит в цикл сохранения. Любые другие предложения? – Eugene

Смежные вопросы