I have this code:
CGPathRef cgPath = [path quartzPath];
self.blackLine.path = cgPath;
self.whiteDashes.path = cgPath;
CGPathRelease(cgPath);
We set the CAShapeLayers (self.blackLine
and self.whiteDashes
) path to this CGPathRef
Then immediately release the path
But why do the shapelayers still draw the correct path? When you assign the path
property does it make a copy? Or does it have to do with the ref
or reference
key suffix?
It's fine to be curious, but, in terms of a general philosophy of programming with Apple's APIs, the important thing to remember is that you don't have to care. Memory management is designed so each component only has to take a local perspective. You work to get your part right and rely on other components getting their part right and that's enough to make everything work properly.
In other words, you can rely on
CAShapeLayer
doing what it needs to do in the setter for itspath
property without needing to know the details. In fact, the details are private to the implementation, so you can't really know them. And, even if you delve under the hood to investigate them, they could change in some future implementation, because there's no design contract that prevents it.That said, it almost certainly makes a copy using
CGPathCreateCopy()
or something similar. It could protect against deallocation of the path by retaining it usingCGPathRetain()
(which it would then have to balance with a future call toCGPathRelease()
), but that wouldn't be enough to protect it against the caller passing a mutable path and subsequently mutating it. Making a copy protects against both.