即使CGPathRef被释放,CAShapeLayer如何继续绘制路径(CGPathRef)?

时间:2017-06-02 20:45:38

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

我有这段代码:

touch NEW
touch -t $(date -d '3 week ago' +%Y%m%d%H%M) OLD
if [[ "NEW" -ot "OLD" ]]                                                          
        then echo "file is old"                                                                                       
elif [[ "NEW" -nt "OLD" ]]                                                        
        then echo "file is new"                                                                                       
fi

我们将CAShapeLayers( CGPathRef cgPath = [path quartzPath]; self.blackLine.path = cgPath; self.whiteDashes.path = cgPath; CGPathRelease(cgPath); self.blackLine)路径设置为此self.whiteDashes

然后立即释放路径

但为什么shapelayers仍然绘制正确的路径?分配CGPathRef属性时是否会复制?或者它与pathref密钥后缀有什么关系?

1 个答案:

答案 0 :(得分:1)

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

换句话说,您可以依赖CAShapeLayerpath属性的setter中执行它需要做的事情,而无需了解详细信息。事实上,细节是实施的私密性,因此您无法真正了解它们。而且,即使你深入研究它们,它们也可能在未来的实施中发生变化,因为没有设计合同可以阻止它。

尽管如此,它几乎肯定会使用CGPathCreateCopy()或类似的东西制作副本。它可以通过使用CGPathRetain()保留它来防止路径的重新分配(然后它必须与将来调用CGPathRelease()保持平衡),但这不足以保护它免受调用者通过一条可变路径并随后改变它。制作副本可以防止这两种情况。