2017-06-02 47 views
0

我有這樣的代碼:即使CGPathRef已發佈,CAShapeLayer如何繼續在路徑(CGPathRef)上繪圖?

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

我們設置CAShapeLayers(self.blackLineself.whiteDashes)路徑此CGPathRef

然後立即釋放路徑

但爲什麼在shapelayers仍然得出正確的路徑?當您指定path屬性時,它是否創建副本?或者它是否與refreference鍵後綴有關?

回答

1

對此很好奇,但根據蘋果API編程的一般理念,要記住的重要一點是你不必關心。內存管理的設計使每個組件只需要採用本地視角。你的工作是讓你的部分正確,並依靠其他組件正確地完成它們的部分,這足以使一切正常工作。

換句話說,你可以依賴CAShapeLayer做它需要在其設置器中爲path屬性做的事情,而不需要知道細節。實際上,細節對於實現是私有的,所以你不能真正瞭解它們。而且,即使你深入研究它們,它們也可能在未來的實施中發生變化,因爲沒有設計合同可以阻止它。

這就是說,它幾乎肯定會使用CGPathCreateCopy()或類似的東西來製作副本。它可以通過使用CGPathRetain()(它將不得不平衡未來呼叫到CGPathRelease())來保護它免於路徑的釋放,但是這不足以保護它免受呼叫者傳遞可變路徑並且隨後改變它。製作副本可以防止這兩種情況。