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

ma1*_*w28 5 objective-c objective-c-blocks automatic-ref-counting

__block当您在块内更改变量(在块外声明)指向的地址时,将使用AFAIK .

但是,如果我更改变量指向的值但指针保持不变,该怎么办?例如,如果我有NSMutableArray *array并且我刚刚[array addObject:object]在块内做什么呢?在这种情况下,我没有更改指针array,但我正在更改它指向的值.那么,我还必须用于__block宣告NSMutableArray *array吗?

bbu*_*bum 19

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

即如果你有:

NSArray* foo;
Run Code Online (Sandbox Code Playgroud)

只有__block在更改值时才需要foo.现在,请记住,这foo只不过是"指向所输入事物的指针NSArray".即 foo实际上是64位或32位整数,具体取决于平台.如果你改变那个整数,你需要__block.如果你不这样做,你就不需要了__block.

所以,不,你不需要__block调用addObject:数组,因为你实际上并没有改变它的值foo.

如果你要做类似的事情foo = (expression);,那么你需要__block.

(请注意,这是为什么在OO下进行并发编程非常困难的原因之一...为任何给定的执行路径定义"方差域"非常困难)

  • `__block`表示变量可以改变.无论变量是`__block`还是const-copy(默认值),调用对象上的方法都不会受到影响. (2认同)
  • 如果你使用`self.foo = ...;`那么,不,不需要`__block`,因为这是一个方法调用.也不需要直接修改实例变量(因为对ivar的引用是通过self). (2认同)