2017-06-02 6 views
0

私はこのコードを持っている:CGPathRefが解放されても、パス(CGPathRef)でCAShapeLayerがどのように描画を続けることができますか?

CGPathRef cgPath = [path quartzPath]; 
    self.blackLine.path = cgPath; 
    self.whiteDashes.path = cgPath; 
    CGPathRelease(cgPath); 

私たちは、その後すぐにパス

を解放しかし、なぜshapelayersが正しいパスを描画します。このCGPathRef

にCAShapeLayers(self.blackLineself.whiteDashes)パスを設定? pathプロパティを割り当てるとコピーが作成されますか?または、それはrefまたはreferenceキーサフィックスと関係がありますか?

答えて

1

好奇心を抱いていても大丈夫ですが、AppleのAPIを使ったプログラミングの一般的な考え方では、気にする必要はないことを覚えておいてください。メモリ管理は、各コンポーネントがローカルな視点をとるだけで済むように設計されています。あなたはあなたの部分を正しく得るために働き、他のコンポーネントがその部分を正しく頼りにしているので、すべてが適切に機能するには十分です。

つまり、詳細を知る必要なしに、プロパティのセッターで行う必要があることを、pathプロパティに頼ることができます。実際、細部は実装のプライベートなので、実際にはそれらを知ることはできません。また、調査するために徹底的に調べても、将来の実装では変更できません。なぜなら、これを防ぐ設計契約がないからです。

つまり、ほとんどの場合、コピーはCGPathCreateCopy()またはこれに類するものを使用して作成されます。 CGPathRetain()を使用してパスの割り当てを解除することができます(これは、その後、CGPathRelease()への今後の呼び出しとバランスをとる必要があります)が、呼び出し元が変更可能なパスを通過してからそれを変更するのを防ぐには不十分です。コピーを作成すると、両方に対して保護されます。

関連する問題