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' 可能会导致保留周期”。我已经搜索了互联网,但我找不到一个体面的解决方案来解释为什么这会导致保留周期。我不会在任何地方的街区内称呼“自我”。

另一个奇怪的事情是,如果我写'self.failureBlock(error)',编译器不会给我任何警告!

谁能向我解释发生了什么事?我一定严重遗漏了 ARC 内存管理规则中的某些内容,但我无法弄清楚。

4

1 回答 1

4

当您在操作块中引用“failureBlock”时,您实际上是在执行“self-> failureBlock” - 所以它隐含地保留了 self。您可以做的是创建一个自动变量 SFFailureBlock xFailureBlock = failureBlock; 上面的self操作,然后在block中使用它。[再一次,你想避免任何 self-> 在该块中的引用。]

于 2012-07-27T23:41:44.953 回答