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

Is it necessary to use __block when setting a BOOL flag in a completion block?

我正在使用以下代码:

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

是否需要为此标志使用 __block 限定符?我没有试过它,它似乎有效(设置 BOOL 以便更改在块外可见)但我不清楚它为什么有效。

BOOL 在 .m 的顶部声明:

@implementation NotificationTracking {
    BOOL _isShowingAlert;
}

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

对于异步块,更新局部变量通常没有意义,因此您不会经常在这种情况下看到它。

实例变量,包括在 @implementation 和 class 扩展中声明的实例变量,从不需要 __block 修饰符。仅对于局部变量是必需的,否则这些变量由 Objective-C 块中的值捕获。

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