ブロックをオブジェクトプロパティとして保持するクラスがあります。
@property (nonatomic, readwrite, copy) SFFailureBlock failureBlock;
ここで、SFFailureBlock:
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」を強くキャプチャすると、保持サイクルが発生する可能性があります」というコンパイラの警告が表示されます。私はインターネットを検索しましたが、これが保持サイクルにつながる理由について適切な解決策を見つけることができませんでした。私はどこのブロック内でも「自己」とは呼んでいません。
もう1つの奇妙なことは、「self.failureBlock(error)」と記述しても、コンパイラーが警告を表示しないことです。
誰かが私に何が起こっているのか説明できますか?ARCのメモリ管理ルールに何かが欠けているに違いありませんが、理解できません。