1

我有其保持块作为对象属性的类: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(错误)'编译器不给我任何警告!

任何人都可以向我解释发生了什么事吗?我必须认真思考ARC内存管理规则中的某些内容,但我无法弄清楚。

回答

4

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

+1

除非我误解了,否则在示例__weak或__unsafe_unretained中创建xFailureBlock也可能是一个好主意。 – 2012-07-28 02:06:38

+0

我相信但不知道xFailure auto var for failure块会复制块(然后由封闭块捕获)。 – 2012-07-28 12:55:53

+0

我明白了。但是,不是failureblock是控制器的实例属性吗?我认为一般情况下,当我们做一些像“[self.myarray addObject:anObject];”在一个块内,“myArray”不会被保留。我错了吗? – csotiriou 2012-07-29 15:07:49