看下面的动画执行块,UI控件指针clickButton是如何从栈复制到堆的呢?通过引用(保留)还是仅复制指针值(不是深复制)?
提前致谢。
[UIView animateWithDuration:10.0 animations:^(void){
clickButton.alpha = 1.0; // clickButton is class variable.
}];
当一个块被复制时(在这种情况下就是这样),该块引用的任何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,弱引用可以在这里为您提供帮助。