我有一个包含块作为对象属性的类:

@property (nonatomic, readwrite, copy) SFFailureBlock failureBlock;
.

在哪里sffailureblock:

typedef void (^SFFailureBlock)(NSError *error);
.

我有一个操作也声明为object属性(afhttperqueStoperation),并且我希望它一旦完成就会调用故障块。

    [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(错误)'编译器没有给我任何警告!

有人可以向我解释什么发生了什么?我必须在弧度内存管理规则中严重遗漏一些东西,但我无法弄清楚。

有帮助吗?

解决方案

当您在操作块中引用“失败”时,您真的正在执行“self-> fallyblock” - 因此它隐含地保留了自我。您可以做的是创建一个自动变量sffailureblock xfailureblock= fallyblock;高于自身优势,然后在块中使用它。[再次,您希望避免该块中的任何自我>引用。]

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top