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



我使用以下代码:

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

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

BOOL 在 .m 的顶部声明,因此:

@implementation NotificationTracking {
    BOOL _isShowingAlert;
}
更新

局部变量时需要__block限定符。如果要更新类属性(或实例变量),则不需要__block限定符。

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

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

这里发生的情况是,修改是通过隐式捕获的self变量完成的。即使变量self是按值捕获的,它也提供了对类的所有实例变量的引用,从而允许块进行更改。

最新更新