用于CAKeyFramAnimation的CGImageCreateWithImageInRect的内存管理

时间:2012-09-14 11:10:45

标签: ios memory-management memory-leaks cakeyframeanimation cgimageref

我正在使用CAKeyFrameAnimation来动画几个png图像。我使用CGImageCreateWithImageInRect

从一个png图像中剪切它们

当我在XCode中运行Analyze功能时,它会显示潜在的内存泄漏。他们是CGImageCreateWithImageInRect。但是当我在创建动画对象后使用CGImageRelease时,没有显示任何图像(我知道原因,但是当我不使用发布时,会有泄漏)。

有人能解释一下这个记忆问题的情况吗?什么是最好的解决方案?我正在考虑使用CGImageRefs为每个“剪切”创建UIImages。但CAKeyFrameAnimation使用CGImageRef字段,所以我认为没有必要创建UIImages。

UIImage *source = [UIImage imageNamed:@"my_anim_actions.png"];

cutRect = CGRectMake(0*dimForImg.width,0*dimForImg.height,dimForImg.width,dimForImg.height);
CGImageRef image1 = CGImageCreateWithImageInRect([source CGImage], cutRect);
cutRect = CGRectMake(1*dimForImg.width,0*dimForImg.height,dimForImg.width,dimForImg.height);
CGImageRef image2 = CGImageCreateWithImageInRect([source CGImage], cutRect);

NSArray *images = [[NSArray alloc] initWithObjects:(__bridge id)image1, (__bridge id)image2, (__bridge id)image2, (__bridge id)image1, (__bridge id)image2, (__bridge id)image1, nil];

CAKeyframeAnimation *myAnimation = [CAKeyframeAnimation animationWithKeyPath: @"contents"];
myAnimation.calculationMode = kCAAnimationDiscrete;
myAnimation.duration = kMyTime;
myAnimation.values = images; // NSArray of CGImageRefs
[myAnimation setValue:@"ANIMATION_MY" forKey:@"MyAnimation"];
myAnimation.removedOnCompletion = NO;
myAnimation.fillMode = kCAFillModeForwards;

CGImageRelease(image1);CGImageRelease(image2);//YES or NO

2 个答案:

答案 0 :(得分:0)

两种解决方案:

首先:使用[UIImageView animationImages]在多个图片之间制作动画。

第二:将图像存储为Ivars并将其发布到您班级的dealloc

答案 1 :(得分:0)

不确定这是否有帮助,但我遇到类似的问题,使用CGImageCreateWithImageInRect来拍摄图像的各个部分,然后在图像视图中显示这些部分会导致巨大的内存使用。我发现有一点可以改善内存使用率的是将子图像编码为PNG数据并再次将其重新解码为图像。

我知道,这听起来很荒谬,完全多余,对吧?但它帮助了很多。根据{{​​1}}的文档,

  

生成的图像保留对原始图像的引用   表示您可以在调用此功能后释放原始图像。

似乎在显示图像时,UI会复制图像数据,包括复制它所引用的原始图像数据;这就是它使用如此多内存的原因。但是当您将其写入PNG并再次返回时,您将创建一个独立的图像数据,该数据较小且不依赖于原始图像数据。这只是我的猜测。

无论如何,试试看它是否有帮助。