1

画像をダウンロードするための次のコードがあります。

  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までに、私の .m ファイル カテゴリには __strong iVar があります。

前もって感謝します。

4

2 に答える 2

1

試す

__block __unsafe_unretained typeof (self) bself = self;

- 編集 -

実際に問題を解決したコメント

ivar にアクセスするときは、bself.property を使用して行います。ivar に直接アクセスすると、保持サイクルが発生します。

于 2012-07-03T11:33:07.540 に答える
1

ここで提案されているように、弱い自己参照のジェネリック typeof

__weak __typeof__((__typeof__(self))self) bself = self
于 2012-07-03T11:36:28.353 に答える