我有一个类将块作为对象属性保存:
@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内存管理规则中的一些内容,但我无法弄明白。
答案 0 :(得分:4)
当你在操作块中引用“failureBlock”时,你实际上在做“自我> failureBlock” - 所以它隐含地保留了自己。你可以做的是创建一个自动变量SFFailureBlock xFailureBlock = failureBlock;在自我操作之上,然后在块中使用它。 [再次,你想避免任何自我>引用INSIDE阻止。]