CAAnimation
アニメーションの最後に処理を提供するために完了ブロック ( CAAnimationBlocksを使用) を使用しており、その完了ブロックの一部がアニメーションを変更しCALayer
ます。これlayer
は、指定子で宣言されていなくても機能し__block
ますが、オブジェクト ポインターは一定のままですが、実際にはオブジェクトを読み取り/書き込みとして扱っています。
私を悩ませているApple ガイドの 1 つの側面は次のとおりです。
__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"];
}
私の実際の質問は次のとおりです。私はこれを正しく行っていますか(私のクモの感覚はチクチクしています)。
EDITまた、アプリが MRR を使用していることも追加する必要がありますが、レイヤーが本質的に静的であることを考えると、保持/解放に問題はありません(それらの有効期間は含まれているものですNSView
)。また、ガイドの「避けるべきパターン」セクションで「すべきではない」と書かれていることを正確に行っているように見えますが、その理由は (私には) 明らかではありません。