即使CGPathRef已发布,CAShapeLayer如何继续在路径(CGPathRef)上绘图?
问题描述:
我有这样的代码:即使CGPathRef已发布,CAShapeLayer如何继续在路径(CGPathRef)上绘图?
CGPathRef cgPath = [path quartzPath];
self.blackLine.path = cgPath;
self.whiteDashes.path = cgPath;
CGPathRelease(cgPath);
我们设置CAShapeLayers(self.blackLine
和self.whiteDashes
)路径此CGPathRef
然后立即释放路径
但为什么在shapelayers仍然得出正确的路径?当您指定path
属性时,它是否创建副本?或者它是否与ref
或reference
键后缀有关?
答
对此很好奇,但根据苹果API编程的一般理念,要记住的重要一点是你不必关心。内存管理的设计使每个组件只需要采用本地视角。你的工作是让你的部分正确,并依靠其他组件正确地完成它们的部分,这足以使一切正常工作。
换句话说,你可以依赖CAShapeLayer
做它需要在其设置器中为path
属性做的事情,而不需要知道细节。实际上,细节对于实现是私有的,所以你不能真正了解它们。而且,即使你深入研究它们,它们也可能在未来的实施中发生变化,因为没有设计合同可以阻止它。
这就是说,它几乎肯定会使用CGPathCreateCopy()
或类似的东西来制作副本。它可以通过使用CGPathRetain()
(它将不得不平衡未来呼叫到CGPathRelease()
)来保护它免于路径的释放,但是这不足以保护它免受呼叫者传递可变路径并且随后改变它。制作副本可以防止这两种情况。