0

我有这个代码:

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

我们将 CAShapeLayers (self.blackLineself.whiteDashes) 路径设置为此CGPathRef

然后立即释放路径

但是为什么shapelayers仍然绘制正确的路径?当您分配path财产时,它会复制吗?还是与reforreference后缀有关?

4

1 回答 1

1

很好奇很好,但是,就使用 Apple API 进行编程的一般哲学而言,要记住的重要一点是您不必关心。内存管理被设计成每个组件只需要从本地角度来看。您努力使自己的部分正确,并依靠其他组件正确完成,这足以使一切正常工作。

换句话说,您可以依靠在CAShapeLayersetter 中为其属性做它需要做的事情,path而无需知道细节。事实上,细节对于实现来说是私有的,所以你无法真正了解它们。而且,即使您深入研究它们,它们也可能在未来的一些实施中发生变化,因为没有设计合同可以阻止它。

也就是说,它几乎可以肯定会使用CGPathCreateCopy()或类似的东西制作副本。它可以通过保留路径来防止释放路径CGPathRetain()(然后它必须与未来的调用平衡CGPathRelease()),但这不足以保护它免受调用者传递可变路径并随后对其进行突变的影响。制作副本可以防止两者。

于 2017-06-03T01:03:59.947 回答