cocoa - 即使 CGPathRef 已释放,CAShapeLayer 如何继续在路径 (CGPathRef) 上绘制?

标签 cocoa cocoa-touch core-graphics core-animation cgpathref

我有这个代码:

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

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

然后立即释放路径

但是为什么 shapelayers 仍然画出正确的路径呢?当您分配 path 属性时,它会复制吗?或者它与 refreference 键后缀有关吗?

最佳答案

好奇是好事,但是,就使用 Apple API 进行编程的一般理念而言,要记住的重要一点是您不必关心。内存管理的设计使得每个组件只需采取本地视角。您努力使自己的部分正确,并依赖其他组件使其部分正确,这足以使一切正常工作。

换句话说,您可以信赖 CAShapeLayer在 setter 中执行其 path 需要执行的操作无需了解详细信息即可获得属性(property)。事实上,细节对于实现来说是私有(private)的,所以你无法真正了解它们。而且,即使您深入研究它们,它们也可能在未来的某些实现中发生变化,因为没有设计契约(Contract)可以阻止它。

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

关于cocoa - 即使 CGPathRef 已释放,CAShapeLayer 如何继续在路径 (CGPathRef) 上绘制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44337185/

相关文章:

swift - 是否有正确的方法来确定 NSNumber 是使用 Swift 从 Bool 派生的?

objective-c - 在非空数组上获取 'index 0 beyond bounds for empty array' 错误

objective-c - 是否可以覆盖 UILabel 的 drawTextInRect 方法以更改 UILabel 的文本大小?

Cocoa:如何实现具有可编辑文本区域的自定义 NSView?

swift - 在 NSOutlineView 中使用 Swift 结构

ios - 如何为通知中心全宽制作 iOS 应用程序扩展?

ios - 绘制圆形相交线

ios - 图像 mask 工作不正常,输出图像是黑白的,应该是彩色的

objective-c - 应用程序在运行方法一次后崩溃

ios - 核心情节线程错误 - EXC_BAD_ACCESS(代码=1,地址=0x400002122)