我正在使用CAAnimation
完成块(使用CAAnimationBlocks)在动画结束时提供处理,并且该完成块的一部分会修改动画CALayer
。即使layer
没有使用说明符声明,这也有效__block
,因为对象指针保持不变,但是我确实将对象视为读/写。
Apple Guide中令我困扰的一个方面是:
__block 变量存在于变量的词法范围和在变量的词法范围内声明或创建的所有块和块副本之间共享的存储中。
鉴于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
)。此外,我似乎正在做指南中要避免的模式部分所说的我不应该做的事情,尽管(对我来说)不清楚为什么。