使用多个层时,无法释放未使用的CALayer内存(Can't release unused

2019-06-24 06:25发布

我使用多个CALayer的在我的大的UIImage为内容的应用程序。 不幸的是,当我不需要层也没有图像 - 内存不释放。

我用它来创建层的代码是:

UIImage *im = [UIImage imageNamed:@"image_1.jpg"];
CALayer * l = [CALayer layer];
[l setBounds:CGRectMake(0, 0, 1024, 768)];
[l setPosition:CGPointMake(512, 384)];
[l setAnchorPoint:CGPointMake(0.5, 0.5)];
[l setHidden:NO];
[l setContents:(id) im.CGImage];
[self.layer addSublayer:l]; // self is a subclass of UIView
[self.tmpArr addObject:l]; // self.tmpArr contains the layers I am using (one in this example)

代码中,我用它来释放层和它的内容是:

CALayer * l = [self.tmpArr objectAtIndex:i];
[l removeFromSuperlayer];
[l setHidden:YES];
[l setContents:nil];
[self.tmpArr removeAllObjects];

当我使用仪器内存分析器我看到创建层,但释放时有降低从未当真正的内存增加。 因为我使用ARC我不能使用释放。 我该怎么办错在这里?

谢谢。

Answer 1:

的UIImage的imageNamed:方法使用其静态高速缓存仅在内存紧张的情况下释放。

你的选择是:

  1. 使用-[UIImage imageWithContentsOfFile:]代替。
  2. 忽视的问题。 缓存清理时内存通知的用武之地。


Answer 2:

只是为了记录另一个答案。 我在我的代码生成的图像是使用在运行时绘制CGImageCreateWithImageInRect 。 所产生的对象是CGImageRef。 我简单地忘记使用释放它CGImageRelease使内存消耗逐渐增加和后3或4动画,应用程序崩溃由于存储器约束。

始终释放CGImageRef



文章来源: Can't release unused CALayer memory when using multiple layers