0

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

提前致谢。

[UIView animateWithDuration:10.0 animations:^(void){
    clickButton.alpha = 1.0;  // clickButton is class variable. 
}];
4

1 回答 1

1

当一个块被复制时(在这种情况下就是这样),该块引用的任何objective-c对象都被保留(然后在块被释放时释放)。

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

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


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

于 2012-09-12T09:59:05.723 回答