我使用以下代码:
[_presenter presentViewController:_alert animated:YES completion:^{
_isShowingAlert = YES;
}];
是否需要为此标志使用 __block 限定符?我尝试过没有它,它似乎可以工作(设置 BOOL,以便更改在块外可见),我不清楚它为什么有效。
BOOL 在 .m 的顶部声明,因此:
@implementation NotificationTracking {
BOOL _isShowingAlert;
}
局部变量时需要__block
限定符。如果要更新类属性(或实例变量),则不需要__block
限定符。
对于异步块,更新局部变量通常没有意义,因此您不会经常在此上下文中看到它。
实例变量(包括在 @implementation
和类扩展中声明的变量)永远不需要 __block
修饰符。它只对局部变量是必需的,否则这些变量会被 Objective-C 块中的值捕获。
这里发生的情况是,修改是通过隐式捕获的self
变量完成的。即使变量self
是按值捕获的,它也提供了对类的所有实例变量的引用,从而允许块进行更改。