CAKeyframeAnimation - Анимация массива изображений создает огромное распределение после завершения

Я пытаюсь оживить массив UIImage с CAKeyframeAnimation, Легко в теории.
Пример кода внизу поста.

Моя проблема в том, что после того, как анимация закончилась, у меня огромная утечка, от которой невозможно избавиться.

Код для инициации 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"];
}

Добавление делегата в анимацию и удаление анимации вручную вызывают тот же эффект утечки:

... // 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
    }
}

В результате всегда огромное распределение. Размер стека памяти пропорционален размеру изображений:

введите описание изображения здесь

Я загрузил пример на GitHub, чтобы проверить код.

1 ответ

Решение

РЕШИТЬ

Я нашел проблему.

Как gabbler, проблемы утечки не было. Проблема заключалась в высоком распределении изображений.

Я выпускал массив с изображениями, однако изображения не исчезали из памяти.

Итак, наконец я нашел проблему:

    [UIImage imageNamed:@""];

Из определения метода:

This method looks in the system caches for an image object with the specified name and returns that object if it exists. If a matching image object is not already in the cache, this method locates and loads the image data from disk or asset catelog, and then returns the resulting object. You can not assume that this method is thread safe.

Так, imageNamed: сохраняет изображение в приватном кеше
- Первая проблема заключается в том, что вы не можете контролировать размер кеша.
- Вторая проблема заключается в том, что кэш не был очищен вовремя, и если вы выделяете много изображений с 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.

Пример проекта с решением здесь.

Другие вопросы по тегам