1

ブロックをオブジェクトプロパティとして保持するクラスがあります。

@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のメモリ管理ルールに何かが欠けているに違いありませんが、理解できません。

4

1 に答える 1

4

When you refer to "failureBlock" in the operation's block, you are really doing "self-> failureBlock" - so it implicitly retains self. What you can do is create an automatic variable SFFailureBlock xFailureBlock = failureBlock; above the selfoperation, then use it in the block. [Again, you want to avoid any self-> references INSIDE that block either.]

于 2012-07-27T23:41:44.953 に答える