请参阅以下动画执行块,UI控件指针clickButton如何从堆栈复制到堆?通过引用(保留)或只复制指针值(不是深拷贝)?
提前致谢。
[UIView animateWithDuration:10.0 animations:^(void){
clickButton.alpha = 1.0; // clickButton is class variable.
}];
答案 0 :(得分:1)
当复制一个块时(在这种情况下),将保留块引用的任何objective-c对象(然后在释放块时释放它)。
在这种情况下,如果clickButton
是块外的局部变量,它将保留在块内。但是,你说它是一个“类变量”,我认为你的意思是它是一个实例变量。因此,该块实际上保留了self
,因为对ivar的引用实际上是self
内对ivar的隐式查找。
在MRR(非ARC)代码中,捕获块实际上不保留任何标有__block
存储限定符的obj-c对象。这是出于技术原因,但它已被许多人利用。但是,在ARC代码中,__block
- 限定变量确实被块保留(并释放)。如果您需要ARC下的非保留对象,则可以使用__unsafe_unretained
代替。但是,在ARC代码中,弱引用通常可以解决__unsafe_unretained
变量所做的相同问题,但更安全。
由于此处的块具有临时生命周期(它仅在动画的持续时间内存在),因此保留self是没有问题的。但是,对于更长久的块,其寿命实际上与self
的块相关(例如,它们存储在ivar中,或存储在self
拥有的对象上),您应该注意不要引入保留周期。如果您使用ARC,弱引用可以帮助您。