2013-12-12 22 views
0

Чтобы избежать модального поведения, я разрешаю пользователю прерывать работу CABasicAnimation, а в контексте этого приложения действие пользователя вызывает новое состояние, в котором существующий CALayers больше не должен существовать. Я не использую ARC (и, возможно, это моя проблема, но несут этот вопрос старой школы).CAAnimation запускает обратные вызовы в выпуске CALayer - Mac OS X

Когда пользователь выполняет действия, для группы активного CALayers Я делаю это:

for(CALayer *c in layerArray){ 
    [c removeAllAnimations]; 
    [c removeFromSuperlayer]; 
    [c release]; 
} 
[layerArray removeAllObjects]; 

(Поверьте мне, что, к лучшему или к худшему, это не более-релиз CALayers). Однако, возвращаясь из этой процедуры и отдавая управление системе, система вызывает внутреннюю операционную систему run_animation_callbacks и сбои, поскольку она пытается отправить сообщения зомби - одному из CALayers, который был удален и выпущен. Почему нет [c removeAllAnimations], чтобы сообщить ОС о прекращении выполнения обратных вызовов на этом объекте?

Спасибо.

ответ

0

Выяснил это, оставив здесь ответ, если он полезен другим.

Когда CAAnimation удаляется (с removeAllAnimations вызова в коде выше), он вызывает animationDidStop:finished: метода делегата сказать делегату, что анимация была прервана. (Интересно, что он делает это, даже если вы установите делегата CALayer's на ноль при удалении анимации).

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

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