5

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

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]; 

Выполнение этого действия и использование инструментарий-Activity Monitor, память не передается, если я не освобожу полное изображение.

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

+0

вы можете попробовать взять его в autoreleasepool – SAKrisT

ответ

0

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

Создание экземпляра:

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

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

[animation release]; 
+0

'[CAKeyframeAnimation animationWithKeyPath:]' возвращает автореализованный объект (согласно соглашению об именах), и он, похоже, не сохраняет его (по крайней мере, он не делает этого в коде, который он представил), поэтому он должен быть в порядке. Выполнение 'alloc/release' вместо этого не изменит этого. Действительно, из его кода я бы сказал, что все в порядке, поэтому проблема должна быть в другом месте. – DarkDust

+0

Правда, кроме того, он не имеет контроля, когда он освобождается, когда он автореализован. Похоже, что его автореализовывают, когда представление разрушено, поэтому кажется, по крайней мере, что-то стоит попробовать. –

+0

Даже делая анимацию alloc/init и release, память не уменьшается при использовании Activity Monitor. Таким образом, нет разницы в памяти, использующей autorelease или release. Если я прокомментирую строку animation.values ​​= arrayOfImages; анимация не отображается и память не увеличивается, поэтому моя проблема заключается в том, что когда анимация заканчивается, память вообще не выпускается, если я не освобожу ImageView. – nano

0

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

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

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

Это все .. в основном анимированный - знак - отменить - анимировать - отметьте. Вы должны увидеть, что снимок кучи уменьшается до 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

Спасибо за ваш ответ. Он уменьшается почти до нуля, как только анимация заканчивается, но только если я выпущу ImageView. Не выпуская его, рост кучи довольно высок (от 40 КБ до 800 КБ каждый раз). Это означает, что CoreAnimation не выпускает, когда он заканчивается. – nano

0

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

Смежные вопросы