带块的ARC和保留循环

我有一个类,它将一个块作为对象属性:

@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.failureBlock(error)’,编译器不会给我任何警告!

任何人都可以向我解释发生了什么事吗? 我必须严重遗漏ARC内存管理规则中的一些内容,但我无法弄明白。

当你在操作块中引用“failureBlock”时,你实际上正在做“self-> failureBlock” – 所以它隐含地保留了self。 你可以做的是创建一个自动变量SFFailureBlock xFailureBlock = failureBlock; 在自我操作之上,然后在块中使用它。 [再次,你想要避免任何自我>参考INSIDE阻止。]