关于ios:什么时候不在Objective-C中使用__block?

When and when not to use __block in Objective-C?

当使用块时,为什么某些变量需要块,而其他变量(如函数参数)不需要块?


这个问题的措词确实是错误的。不是"我什么时候需要封锁?",它是"布洛克做什么?"一旦你理解了它的作用,你就可以在需要的时候分辨出来。

通常,当块捕获变量时(捕获发生在块引用自身外部变量时),它会创建变量的副本(注意,对于对象,它会创建指针的副本,而不是对象本身),如果它是对象,则会保留它。

这意味着,对于正常行为,不能使用块更改块外的值。此代码无效,例如:

1
2
int x = 5;
void(^block)() = ^{ x = 10; };

_uuu块限定符做了两个更改:最重要的是,它告诉编译器块应该直接捕获它,而不是复制它。这意味着您可以更新块外变量的值。更不重要的是,在不使用ARC的情况下,它告诉编译器不要保留捕获的对象。


代码块可以访问声明块的范围内的任何变量。但是,在块范围之外声明的任何变量/对象在块内都是不可变的。你可以读,但不能改变它。在对象的声明中设置_uuu块标志允许在块的作用域内对其进行更改。

编辑:下面是一个例子:

1
2
3
4
NSString *myString = @"hello";
dispatch_sync(dispatch_get_main_queue(), ^{
    myString = @"hello world";
});

这不起作用,您将收到一条错误消息。

1
2
3
4
__block NSString *myString = @"hello";
dispatch_sync(dispatch_get_main_queue(), ^{
    myString = @"hello world";
});

问题解决了!