1. ホーム
  2. cocoa-touch

[解決済み] ARC対応コードにおける「このブロック内で強く[オブジェクト]を捕捉するとretainサイクルになる可能性があります」という警告の修正

2022-05-17 15:50:25

質問

ARC を有効にしたコードで、ブロックベースの API を使用するときに、潜在的な保持サイクルに関する警告を修正するにはどうすればよいですか。

警告は

Capturing 'request' strongly in this block is likely to lead to a retain cycle

このコードのスニペットによって生成されます。

ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:...

[request setCompletionBlock:^{
    NSDictionary *jsonDictionary = [[CJSONDeserializer deserializer] deserialize:request.rawResponseData error:nil];
    // ...
    }];

警告は、オブジェクトの使用と連動している request をブロック内で使用したことに関連しています。

どのように解決するのですか?

自分自身に返信する。

私のドキュメントの理解では、キーワード block を使用し、ブロック内でそれを使用した後に変数をnilに設定することは問題ないはずですが、それはまだ警告を表示します。

__block ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:...

[request setCompletionBlock:^{
    NSDictionary *jsonDictionary = [[CJSONDeserializer deserializer] deserialize:request.responseData error:nil];
    request = nil;
// ....

    }];

更新しました。 キーワード '_' で動作するようになりました。 弱い' の代わりに ' _block' の代わりに '_

ASIHTTPRequest *_request = [[ASIHTTPRequest alloc] initWithURL:...
__weak ASIHTTPRequest *request = _request;

[request setCompletionBlock:^{
    NSDictionary *jsonDictionary = [[CJSONDeserializer deserializer] deserialize:request.responseData error:nil];
    // ...
    }];

iOS 4 もターゲットにしたい場合は __unsafe_unretained の代わりに __weak . 同じ動作ですが、オブジェクトが破壊されたときに自動的にnilに設定されるのではなく、ポインタがぶら下がったままになります。