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

4

我有一个名为sublayerCALayer对象。在我的视图控制器中,我将其作为self.sublayer使用,因为我已经在视图控制器的头文件中将其设置为属性。

我将子层的内容属性设置为使用CGImageRef对象imageRef创建的UIImage对象。

self.subLayer.contents = (id)[UIImage imageWithCGImage:imageRef].CGImage;

现在,我立即释放imageRef对象,因为它已被用于创建子层内容,不再需要:

CGImageRelease(imageRef);

然而,以下是困扰我的问题。在代码的后续部分中,我将不再需要 self.sublayer.contents,我想确保正确释放它所包含的 CGImage
如果我NSLog self.sublayer.contents,它会将此打印到控制台:<CGImage 0x146537c0> 因此,我也需要能够释放这个CGImage
我尝试使用下面的方法来释放CGImage,但NSLog仍然会在控制台上打印相同的输出:
CGImageRelease((__bridge CGImageRef)(self.subLayer.contents)); 如果我使用下面的方法,则NSLog将在控制台上打印(null),但我担心这从技术上讲并没有释放CGImage
self.subLayer.contents = nil;

将子层的内容属性设置为nil是否能正确释放CGImage,或者我想这样做没有严格释放CGImage

我正在我的应用程序中遇到内存问题,因此我需要确保我正确释放了这个CGImage


sublayer 是视图的层吗? - David Rönnqvist
这是我设置子层的方式:self.subLayer = [CALayer layer]; - user3344977
1个回答

3
CALayer 上的 contents 属性是一个保留属性,这意味着它的 setter 实现或多或少会执行以下操作:
- (void)setContents:(id)contents
{
    if (contents == _contents) return; // Same as existing value
    [_contents release];
    _contents = [contents retain];
}

因此,当您将nil设置为新内容时,旧内容将被释放。

谢谢你的回答,但我必须说我有点失望。我以为我终于找到了导致内存问题的原因。哎呀。 - user3344977

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接