ブロックを持つアークとサイクルを保持します
-
13-12-2019 - |
質問
オブジェクトプロパティとしてブロックを保持するクラスを持っています:
@property (nonatomic, readwrite, copy) SFFailureBlock failureBlock;
.
ここでSFFILUREBLOCK:
typedef void (^SFFailureBlock)(NSError *error);
.
私はオブジェクトプロパティ(AFHTTPRequestOperation)として宣言されていて、完了したら障害ブロックを呼び出したいと思います。
[self.operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
__weak NSError *error = [NSError errorWithDomain:@"com.test" code:100 userInfo:@{@"description": @"zero results"}];
failureBlock(error);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"nothing");
}];
.
私はコンパイラ警告を受ける "このブロックで強くキャプチャすることは維持サイクルにつながる可能性があります。私はインターネットを検索しましたが、私はこれが維持サイクルにつながる理由に関して私はまともな解決策を見つけることができませんでした。私はブロック内の「自己」をどこにでも呼ばれていません。
もう一つの奇妙なことは、「self.failureblock(エラー)」を書いた場合、コンパイラは私に警告を与えない!
誰かが私に何が起こっているのか説明できますか?私はアークメモリ管理ルールで何かを真剣に欠けている必要がありますが、それを理解することはできません。
解決
操作のブロックの「失敗ブロック」を参照すると、「自己障害ブロック」を実際に行っているので、暗黙的に自己を保持しています。あなたができることは自動変数sffiailureblock xfailureblock=失敗ブロックを作成することです。セルフオペレーションの上で、ブロック内で使用してください。[繰り返しますが、そのブロック内の自己→参照も避けたいと思います。]
所属していません StackOverflow