我有这个代码:
CGPathRef cgPath = [path quartzPath];
self.blackLine.path = cgPath;
self.whiteDashes.path = cgPath;
CGPathRelease(cgPath);
我们将 CAShapeLayers(self.blackLine
和 self.whiteDashes
)路径设置为此 CGPathRef
然后立即释放路径
但是为什么 shapelayers 仍然画出正确的路径呢?当您分配 path
属性时,它会复制吗?或者它与 ref
或 reference
键后缀有关吗?
最佳答案
好奇是好事,但是,就使用 Apple API 进行编程的一般理念而言,要记住的重要一点是您不必关心。内存管理的设计使得每个组件只需采取本地视角。您努力使自己的部分正确,并依赖其他组件使其部分正确,这足以使一切正常工作。
换句话说,您可以信赖 CAShapeLayer
在 setter 中执行其 path
需要执行的操作无需了解详细信息即可获得属性(property)。事实上,细节对于实现来说是私有(private)的,所以你无法真正了解它们。而且,即使您深入研究它们,它们也可能在未来的某些实现中发生变化,因为没有设计契约(Contract)可以阻止它。
也就是说,它几乎肯定会使用 CGPathCreateCopy()
进行复制。或类似的东西。它可以通过使用 CGPathRetain()
保留路径来防止路径被重新分配。 (然后它必须与 future 对 CGPathRelease()
的调用进行平衡),但这不足以保护它免受调用者传递可变路径并随后对其进行变异的影响。制作副本可以防止这两种情况的发生。
关于cocoa - 即使 CGPathRef 已释放,CAShapeLayer 如何继续在路径 (CGPathRef) 上绘制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44337185/