4

私は次のコードを持っています:

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest: request];

operation.completionBlock = ^{
    if([operation hasAcceptableStatusCode]){

    }
};

ARCは[operationhasAcceptableStatusCode]を好まないようで、次の警告が表示されます。「このブロックで「操作」を強くキャプチャすると、保持サイクルが発生する可能性があります」。

私は参照の経験があまりありませんが、ここに行く方法はありますか?

ありがとう、
シャイ

4

1 に答える 1

6

ブロックは、ブロックの外部から参照するオブジェクトをキャプチャ(保持)します。

操作は、操作を保持するcompleteBlockを保持します。したがって、保持サイクルです。

最善の方法は、オブジェクトへの弱参照を作成し、代わりにそれを渡すことです。

AFHTTPRequestOperation * __weak theOperation = operation

operation.completionBlock = ^{
    if (theOperation) {
        return;
    }
};

弱参照は実行時に安全であるため、操作の割り当てが解除されている場合は、nilにメッセージを送信するだけです。

于 2011-11-20T17:23:23.217 に答える