2

ブロック自体の内部の「NSBlockOperation」を参照するのに問題があります。操作がキャンセルされたかどうかを確認する必要があります。ARC対応プロジェクトで実行すると、「searchOperation」へのアクセスがリークするだけのようです。

このコードは基本的に何もしませんが、ARC対応のプロジェクトではリークを示していますが、ARC以外のプロジェクトでは正常に機能しています。

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.searchQueue = [[NSOperationQueue alloc] init];
    self.searchQueue.maxConcurrentOperationCount = 1;

    __block NSBlockOperation *searchOperation = [NSBlockOperation blockOperationWithBlock:^{
        if (searchOperation.isCancelled) return;
    }];

    [self.searchQueue addOperation:searchOperation];
}

ありがとう。

4

1 に答える 1

4

__weak保持サイクルを回避するようにsearchOperationを宣言しました。

__weak NSBlockOperation *searchOperation;
NSBlockOperation *tmp = [NSBlockOperation blockOperationWithBlock:^{
    if (searchOperation.isCancelled) return;
}];
searchOperation = tmp;

別の可能な解決策:使用した後、ブロック内でsearchOperationをnilに設定します。

于 2012-05-17T11:10:51.270 に答える