ASIHTTPRequest completionBlock + ARC

时间:2012-07-03 11:25:25

标签: iphone objective-c ios asihttprequest block

我有以下代码来下载图片:

  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)标识符将self传递给块,但它仍然会被保留。我也尝试了__weak MyClassName *bself = self;,它仍然进入保留周期。看来我在这里遗漏了一些东西,任何人都可以告诉我到底我做错了什么?

供参考imageRequest是我的.m文件类别中的__strong iVar。

提前致谢。

2 个答案:

答案 0 :(得分:1)

__block __unsafe_unretained typeof (self) bself = self;

- 编辑 -

实际解决问题的评论

访问ivars时,使用bself.property进行操作。如果您直接访问您的ivars,它将获得保留周期。

答案 1 :(得分:1)

根据Generic typeof for weak self references

的建议
__weak __typeof__((__typeof__(self))self) bself = self