在完成块中设置BOOL标志时是否需要使用__block?

时间:2015-01-06 15:32:02

标签: objective-c block objective-c-blocks

我使用以下代码:

 [_presenter presentViewController:_alert animated:YES completion:^{
               _isShowingAlert = YES;
            }];

我是否需要为此标志使用__block限定符?我尝试了没有它似乎工作(设置BOOL所以变化在块外可见)并且我不清楚为什么它工作。

BOOL在.m的顶部声明:

@implementation NotificationTracking {
    BOOL _isShowingAlert;
}

2 个答案:

答案 0 :(得分:5)

更新局部变量时需要__block限定符。如果您要更新类属性(或者,在您的情况下是实例变量),则不需要__block限定符。

使用异步块,更新局部变量通常没有意义,所以在这种情况下你不会经常看到它。

答案 1 :(得分:3)

实例变量(包括在@implementation和类扩展中声明的变量)永远不需要__block修饰符。只有局部变量才有必要,否则它们会被Objective-C块中的值捕获。

这里发生的是修改是通过隐式捕获的self变量完成的。尽管变量self是通过值捕获的,但它提供了对类的所有实例变量的引用,允许块进行更改。