在完成块中设置 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 的所有实例变量的引用,允许块进行更改。
我正在使用以下代码:
[_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 的所有实例变量的引用,允许块进行更改。