我正在使用CAKeyFrameAnimation来动画几个png图像。我使用CGImageCreateWithImageInRect
当我在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
答案 0 :(得分:0)
两种解决方案:
首先:使用[UIImageView animationImages]
在多个图片之间制作动画。
第二:将图像存储为Ivars并将其发布到您班级的dealloc
。
答案 1 :(得分:0)
不确定这是否有帮助,但我遇到类似的问题,使用CGImageCreateWithImageInRect
来拍摄图像的各个部分,然后在图像视图中显示这些部分会导致巨大的内存使用。我发现有一点可以改善内存使用率的是将子图像编码为PNG数据并再次将其重新解码为图像。
我知道,这听起来很荒谬,完全多余,对吧?但它帮助了很多。根据{{1}}的文档,
生成的图像保留对原始图像的引用 表示您可以在调用此功能后释放原始图像。
似乎在显示图像时,UI会复制图像数据,包括复制它所引用的原始图像数据;这就是它使用如此多内存的原因。但是当您将其写入PNG并再次返回时,您将创建一个独立的图像数据,该数据较小且不依赖于原始图像数据。这只是我的猜测。
无论如何,试试看它是否有帮助。