gpt4 book ai didi

ios - CAKeyframeAnimation - 动画图像数组在完成后创建一个巨大的分配

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:41:33 26 4
gpt4 key购买 nike

我正在尝试使用 CAKeyframeAnimationUIImage 数组设置动画。理论上很简单。
帖子底部的示例代码。

我的问题是,在动画完成后,我有一个无法消除的巨大漏洞。

初始化 CAKeyframeAnimation 的代码:

- (void)animateImages
{
CAKeyframeAnimation *keyframeAnimation = [CAKeyframeAnimation animationWithKeyPath:@"contents"];
keyframeAnimation.values = self.imagesArray; // array with images

keyframeAnimation.repeatCount = 1.0f;
keyframeAnimation.duration = 5.0;

keyframeAnimation.removedOnCompletion = YES;

CALayer *layer = self.animationImageView.layer;

[layer addAnimation:keyframeAnimation
forKey:@"flingAnimation"];
}

向动画添加委托(delegate)并手动移除动画会导致相同的泄漏效果:

... // Code to change

keyframeAnimation.delegate = self;

// keyframeAnimation.removedOnCompletion = YES;
keyframeAnimation.removedOnCompletion = NO;
keyframeAnimation.fillMode = kCAFillModeForwards;

....

然后:

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
if (flag)
{
[self.animationImageView.layer removeAllAnimations];
[self.animationImageView.layer removeAnimationForKey:@"flingAnimation"]; // just in case
}
}

结果总是一个巨大的分配。内存堆栈的大小与图像的大小成正比:

enter image description here

I uploaded an example to GitHub to check the code.

最佳答案

已解决

我发现了问题。

作为gabbler说没有泄漏问题。问题是图像的高分配。

我正在释放带有图像的阵列,但是图像并没有从内存中消失。

最后我发现了问题:

    [UIImage imageNamed:@""];

来自方法定义:

此方法在系统缓存中查找具有指定名称的图像对象,如果存在则返回该对象。如果匹配的图像对象不在缓存中,此方法会从磁盘或 Assets 目录中定位并加载图像数据,然后返回结果对象。你不能假设这个方法是线程安全的。

因此,imageNamed: 将图像存储在私有(private)缓存中。
- 第一个问题是您无法控制缓存大小。
- 第二个问题是缓存没有及时清理,如果您使用 imageNamed: 分配大量图像,您的应用可能会崩溃。

解决方案:

直接从 Bundle 分配图像:

NSString *imageName = [NSString stringWithFormat:@"imageName.png"];
NSString *path = [[NSBundle mainBundle] pathForResource:imageName

// Allocating images with imageWithContentsOfFile makes images to do not cache.
UIImage *image = [UIImage imageWithContentsOfFile:path];

小问题:

Images.xcassets 中的图像永远不会被分配。因此,将您的图像移到 Images.xcassets 之外,以便直接从 Bundle 分配。

Example project with solution here.

关于ios - CAKeyframeAnimation - 动画图像数组在完成后创建一个巨大的分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27904494/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com