2013-12-12 2 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의). 이 루틴에서 돌아와 시스템에 다시 제어권을 주면 시스템은 내부 OS 루틴 run_animation_callbacks를 호출하여 제거되고 해제 된 CALayers 중 하나 인 좀비에게 메시지를 보내려고하기 때문에 충돌합니다. [c removeAllAnimations]은 OS에 해당 객체에 대한 콜백 실행을 중지하도록하는 데 충분한 이유가 무엇입니까?

감사합니다.

답변

0

다른 사람들에게 도움이 될 수 있도록 여기에 답을 남겨 두었습니다.

위 코드에서 removeAllAnimations 호출을 사용하여 CAAnimation을 제거하면 위임자에게 animationDidStop:finished: 메서드를 호출하여 대리인에게 애니메이션이 중단되었음을 알립니다. (흥미롭게도 애니메이션을 제거 할 때 CALayer's 대리자를 nil로 설정하더라도 마찬가지입니다.)

따라서 removeAllAnimations과 동시에 개체를 놓을 수는 없습니다. 대신, animationDidStop:finished: 메서드는 정상적으로 처리해야하는지 여부를 감지하는 방법이 있어야합니다.