IOS块指针复制问题。

时间:2012-09-12 09:54:46

标签: ios pointers block

请参阅以下动画执行块,UI控件指针clickButton如何从堆栈复制到堆?通过引用(保留)或只复制指针值(不是深拷贝)?

提前致谢。

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

1 个答案:

答案 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,弱引用可以帮助您。