我有这段代码:
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
属性时是否会复制?或者它与path
或ref
密钥后缀有什么关系?
答案 0 :(得分:1)
好奇是好的,但是,就使用Apple的API编程的一般理念而言,要记住的重要一点是你不必关心。内存管理的设计使每个组件只需要采用本地视角。你努力使自己的部分正确,并依靠其他组件来使自己的部分正确,这足以使一切正常运作。
换句话说,您可以依赖CAShapeLayer
在path
属性的setter中执行它需要做的事情,而无需了解详细信息。事实上,细节是实施的私密性,因此您无法真正了解它们。而且,即使你深入研究它们,它们也可能在未来的实施中发生变化,因为没有设计合同可以阻止它。
尽管如此,它几乎肯定会使用CGPathCreateCopy()
或类似的东西制作副本。它可以通过使用CGPathRetain()
保留它来防止路径的重新分配(然后它必须与将来调用CGPathRelease()
保持平衡),但这不足以保护它免受调用者通过一条可变路径并随后改变它。制作副本可以防止这两种情况。