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"; }); |
问题解决了!