我有一个名为CALayer
的{{1}}对象。我在整个视图控制器中将它用作sublayer
,因为我在视图控制器的头文件中将其设置为属性。
我将子图层的内容属性设置为等于使用名为self.sublayer
的{{1}}对象创建的UIImage
对象:
CGImageRef
然后我立即释放imageRef
对象,因为它已被用于创建子图层内容并且不再需要它:
self.subLayer.contents = (id)[UIImage imageWithCGImage:imageRef].CGImage;
然而,这就是困扰我的事情。稍后在代码中,我将不再需要imageRef
,我想确保正确发布它包含的CGImageRelease(imageRef);
。
如果我NSLog self.sublayer.contents
,它会将其打印到控制台:CGImage
所以我也需要能够发布这个self.sublayer.contents
。
我尝试使用它来释放<CGImage 0x146537c0>
,但NSLog仍会将相同内容打印到控制台:
CGImage
如果我使用它,NSLog将以CGImage
的形式打印到控制台,但我担心这在技术上不会释放CGImageRelease((__bridge CGImageRef)(self.subLayer.contents));
:
(null)
将子图层的内容属性设置为CGImage
是否正确释放self.subLayer.contents = nil;
,或者我认为它在技术上不会释放nil
?
我现在在我的应用中遇到内存问题所以我需要确保正确发布此CGImage
。
答案 0 :(得分:2)
contents
上的CALayer
属性是一个保留属性,这意味着它的setter实现或多或少执行此操作:
- (void)setContents:(id)contents
{
if (contents == _contents) return; // Same as existing value
[_contents release];
_contents = [contents retain];
}
因此,当您将nil
设置为新内容时,旧内容将发布。