需要释放CALayer的contents属性中包含的CGImage

时间:2014-03-27 06:07:01

标签: ios objective-c core-graphics calayer cgimage

我有一个名为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

1 个答案:

答案 0 :(得分:2)

contents上的CALayer属性是一个保留属性,这意味着它的setter实现或多或少执行此操作:

- (void)setContents:(id)contents
{
    if (contents == _contents) return; // Same as existing value
    [_contents release];
    _contents = [contents retain];
}

因此,当您将nil设置为新内容时,旧内容发布。