我正在使用 CAAnimation
完成 block (使用 CAAnimationBlocks )在动画结束时提供处理,并且该完成 block 的一部分修改动画 CALayer
。即使 layer
没有使用 __block
说明符声明,这仍然有效,因为对象指针保持不变,但我实际上将对象视为读/写。
Apple Guide 的一个方面困扰我的是:
__block variables live in storage that is shared between the lexical scope of the variable and all blocks and block copies declared or created within the variable’s lexical scope.
鉴于 layer
是一个集合迭代器,在我看来,如果我使用 __block
说明符,它实际上会中断。
这里是有问题的代码:
for (CALayer *layer in _myLayers) // _myLayers is an ivar of the containing object
{
CAAnimationGroup *group = ...;
...
group.completion = ^(BOOL finished)
{
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue
forKey:kCATransactionDisableActions];
layer.position = [self _findPosition];
[CATransaction commit];
[layer removeAnimationForKey:@"teleportEffect"];
};
[layer addAnimation:group forKey:@"teleportEffect"];
}
我的实际问题是:我这样做是否正确(我的蜘蛛感觉很刺痛)。
编辑 我还应该补充一点,我的应用程序使用 MRR,但是保留/释放没有问题,因为这些层本质上是静态(它们的生命周期是包含 NSView
)。此外,我似乎正在做 guide 的要避免的模式部分。说我不应该这样做,尽管(我)不清楚为什么。
最佳答案
__block
变量在 block (和封闭范围)内是可变的,并且如果任何引用 block 被复制到堆中则被保留。
我认为在您的情况下您不需要 block 变量,因为您正在更改 block 内对象 layer
的值,因为它属于 _myLayers
似乎是一个实例变量的数组很难在每个 block 执行之前释放对象......但是你可以添加 __block
存储类型修饰符来保留对象,但是 如果您使用的是 ARC,对象变量会在 block 被复制和稍后释放时自动保留和释放。
关于objective-c - 我是否应该在对象指针上使用 __block 说明符,即使它在没有它的情况下也能工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12445475/