Удаление CAKeyframeAnimation не освобождает память - PullRequest
5 голосов
/ 26 января 2012

Я добавляю CAKeyframeAnimation к слою ImageView для представления анимации изображения:

CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"contents"];
animation.values = arrayOfImages;
[animation setRemovedOnCompletion:YES];
animation.delegate = self;
[animation setValue:delegate forKey:@"AnimatedImageViewDelegate"];
animation.repeatCount = repeatCount;
animation.fillMode = kCAFillModeForwards;
animation.calculationMode = kCAAnimationDiscrete;
[animation setValue:animationName forKey:@"name"];

Когда я хочу запустить анимацию, я звоню:

animation.duration = duration;
[self.layer addAnimation:animation forKey:animationName];
[self.layer setContents:[animation.values lastObject]];

Когда анимация закончится, я хочу полностью удалить ее и освободить память.

[self.layer removeAllAnimations];       
[self.layer removeAnimationForKey:animationName];

При этом и использовании Instruments-Activity Monitor память не восстанавливается, пока я не выпущу полный imageView.

Как я могу освободить эту анимационную память без уничтожения UIImageView ???

Ответы [ 4 ]

0 голосов
/ 15 апреля 2018

В моем случае CAKeyframeAnimation, добавленный в imageView, и контейнерное представление не освобождаются, даже если его нет в иерархии представления.

Оказалось, что его держит делегат CAKeyframeAnimation. Я только что удалил делегата:

beatAnimation.delegate = nil
0 голосов
/ 14 февраля 2012

Во-первых, если это проект iOS 5, ARC должен обрабатывать ваши релизы для вас - что действительно приятно!

Теперь - я использовал много анимаций в своем проекте и заметил похожие всплески в куче. Я предполагаю, что CA кэширует много того, что анимировано внутри. Для подтверждения того, что эти элементы действительно автоматически высвобождаются, я рекомендую настроить тест на распределение или утечки с помощью инструмента инструментов и выполнить следующие действия:

  1. Определите ситуацию, при которой вы будете запускать и анимацию.
  2. Отметьте кучу после завершения анимации.
  3. Запустите что-то, что приведет вас к другому виду, где объекты должны были быть удалены.
  4. Повторите процесс в шагах 1-2-3 столько раз, сколько вы хотите. Обычно я делаю это примерно 10 раз или около того.

Вот и все .. в основном, animate - mark - undo - animate - mark. Вы должны увидеть уменьшение количества кучи до 0 или почти до 0, если CoreAnimation правильно высвобождает объекты автоматически!

Для получения дополнительной информации о том, как провести тестирование, посмотрите эту статью:

http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/

0 голосов
/ 23 апреля 2015

У меня та же проблема с памятью с CAKeyframeAnimation, когда заданные значения = массив изображений. И я вижу, что проблема, которую я получаю, состоит в том, что изображения инициализируются [UIImage imagewithname:], который по умолчанию кэшируется в памяти. Так что мое решение - это изменить [UIImage imageWithContentsOfFile:] Надеюсь, что это полезно.

0 голосов
/ 27 января 2012

Вы используете удобный метод для создания экземпляра объекта. Таким образом, вы не будете контролировать, когда объект действительно будет выпущен. Чтобы это контролировать, вам нужно выделить объект и освободить его самостоятельно:

Создать экземпляр:

CAKeyframeAnimation *animation = [[CAKeyframeAnimation alloc] init];

Затем после завершения анимации вызовите после удаления строки:

[animation release];
...