与块ARC和保持周期(ARC with blocks and retain cycles)

2019-07-30 16:21发布

我有其保持块作为对象属性的类:

@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(错误)”编译器不给我任何的警告!

谁能给我解释是怎么回事? 我必须认真缺少ARC内存管理规则的东西,但我无法弄清楚。

Answer 1:

当你是指在操作的块“failureBlock”,你真的做“自我> failureBlock” - 因此它含蓄地保持自我。 你可以做的就是创建一个自动变量SFFailureBlock xFailureBlock = failureBlock; 的selfoperation以上,则在该块中使用它。 [再次,要避免任何自我>里面那个块参照要么]



文章来源: ARC with blocks and retain cycles