3

我在我的应用程序中使用多个 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,所以我不能使用 release。我在这里做错了什么?

谢谢。

4

2 回答 2

6

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

您的选择是:

  1. 改为使用-[UIImage imageWithContentsOfFile:]
  2. 忽略问题。当内存通知进来时,缓存被清理。
于 2012-05-08T09:00:56.847 回答
0

只是为了记录另一个答案。我在代码中创建的图像是在运行时使用CGImageCreateWithImageInRect. 生成的对象是 CGImageRef。我只是忘记释放它,CGImageRelease导致内存消耗逐渐增加,在 3 或 4 个动画之后,应用程序由于内存限制而崩溃。

总是释放一个CGImageRef.

于 2014-06-12T15:54:58.563 回答