IOS块指针复制问题。

IOS块指针复制问题。,ios,pointers,block,Ios,Pointers,Block,请参阅下面的动画执行块,UI控制指针clickButton如何从堆栈复制到堆?通过引用(保留)还是仅复制指针值(不是深度复制) 提前谢谢 [UIView animateWithDuration:10.0 animations:^(void){ clickButton.alpha = 1.0; // clickButton is class variable. }]; 复制块时(在本例中是这样),块引用的任何objective-c对象都将保留(然后在解除块锁定时释放) 在这种情况下,

请参阅下面的动画执行块,UI控制指针clickButton如何从堆栈复制到堆?通过引用(保留)还是仅复制指针值(不是深度复制)

提前谢谢

[UIView animateWithDuration:10.0 animations:^(void){
    clickButton.alpha = 1.0;  // clickButton is class variable. 
}];
复制块时(在本例中是这样),块引用的任何objective-c对象都将保留(然后在解除块锁定时释放)

在这种情况下,如果
clickButton
是块外部的局部变量,它将保留在块内部。然而,你说它是一个“类变量”,我想你的意思是它是一个实例变量。因此,块实际上保留了
self
,因为对ivar的引用实际上是
self
中ivar的隐式查找

在MRR(非ARC)代码中,任何标有
\u块
存储限定符的obj-c对象实际上都不会被捕获块保留。这是出于技术原因,但它已被许多人利用。但是,在ARC代码中,
\u块
-限定变量确实会被块保留(和释放)。如果需要ARC下的非保留对象,可以使用
\uu unsafe\u unretained
。然而,在ARC代码中,弱引用通常会解决与
\uuuuuunsafe\uunretained
变量相同的问题,但更安全



因为这里的块有一个临时的生命周期(它只在动画的持续时间内存在),所以保留self没有问题。但是,对于寿命实际上与
self
相关的永久性块(例如,它们存储在ivar中或
self
拥有的对象上),应注意不要引入保留周期。如果您使用的是ARC,弱引用可以在这里帮助您。

复制就是复制。这不是保留。您不能真正复制块的“值”——因为它本质上是它执行的实际代码。实际上,块是包含函数指针的Objective-C对象。@H2CO3:这说起来很尴尬,但他实际上是在询问捕获变量的内存语义,而不是块本身。谢谢Kevin。是的,你的说明很清楚,还有一个问题,上面的动画什么时候会由系统runloop执行?@Jinhua:你调用的这个动画API会立即执行动画,暂时按住块直到动画完成,然后调用并释放块真的吗?我将动画时间设置为10秒,但我的调试显示调用返回得非常快,因此我怀疑动画将添加到系统runloop中,然后在稍后执行。@jianhua:动画没有阻塞。那太可怕了。动画本质上是异步的,这就是为什么它们有一个完成块。因此,动画将立即启动,并将在后台运行,直到完成,此时它将再次调用主线程上的完成块。谢谢。是的,我明白了,还有。