ARC会告诉我何时必须使用__block吗?

5
据我所知,当您在块内更改变量(在块外声明)指向的地址时,会使用__block
但是,如果我更改变量指向的值而指针保持不变呢?比如说,如果我有一个NSMutableArray *array,并且在块内只是执行[array addObject:object],那么这种情况下,我没有改变指针array,但是我改变了它所指向的值。所以,在声明NSMutableArray *array时,是否仍然必须使用__block呢?
1个回答

19

只有在更改变量的值时才需要使用__block

例如,如果您有:

NSArray* foo;
只有在更改foo的值时才需要使用__block。请记住,foo只是“指向类型为NSArray的事物的指针”。即foo实际上是一个64位或32位整数(取决于平台)。如果更改该整数,则需要__block。如果不更改,则不需要__block。因此,在调用数组的addObject:方法时不需要__block,因为您并未实际更改foo的值。但是如果您执行像foo = (expression);这样的操作,那么就需要__block。(请注意,这是面向对象并发编程非常困难的原因之一...极难定义任何给定执行路径的“变化域”)

编译器优化怎么办?__block 可能会提示对象永远不会改变,如果 NSArray 被内联,后续对 capacity 的调用可能会出错。 - Daniel
2
__block 表示变量可以修改。无论变量是 __block 还是常量副本(默认情况下),在对象上调用方法都不会受到影响。 - bbum
但是如果变量(NSArray *)是一个self属性,会发生什么?需要添加__block吗? - Amnysia
2
如果您正在使用 self.foo = ...;,那么不需要 __block,因为这是一个方法调用。也不需要直接修改实例变量(因为对 ivar 的引用是通过 self 进行的)。 - bbum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接