2011-03-18 3 views
0
self.mLineAnimation = [CABasicAnimation animationWithKeyPath:@"path"]; 
mLineAnimation.fromValue = (id)mStartPath; 
mLineAnimation.toValue = (id)mEndPath; 
mLineAnimation.duration = 2; 
mLineAnimation.repeatCount = 0; 
[mLineAnimation setDelegate:self]; 
mLineAnimation.removedOnCompletion = NO; 
mLineAnimation.fillMode = kCAFillModeForwards; 
mLineAnimation.timingFunction = [CAMediaTimingFunction 
            functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
[mShapeLayer addAnimation: mLineAnimation forKey: @"animateLine"]; 

animationDidStop을 구현하기 위해 위임자를 설정했음을 유의하십시오. 내 애니메이션은 표보기 셀에서 실행됩니다. 이제 테이블을 빠르게 스크롤 할 때 응용 프로그램이 EXC_BAD_ACCESS와 충돌합니다. 위임자를 설정하지 않으면 응용 프로그램이 중단되지 않습니다. 여기에 무엇을 할 지 이끌어 주시겠습니까? 스택 트레이스는 다음이다 : 애니메이션을 생성 한 오브젝트 ("자기" "self.mLineAnimation"로 지칭되는 객체)를 파괴 한 후대리자 크래시가있는 CABasicAnimation

#0 0x0168ea63 in objc_msgSend 
#1 0x056ff0a0 in ?? 
#2 0x00ee36cb in run_animation_callbacks 
#3 0x00ee3589 in CA::timer_callback 
#4 0x0150dfe3 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ 
#5 0x0150f594 in __CFRunLoopDoTimer 
#6 0x0146bcc9 in __CFRunLoopRun 
#7 0x0146b240 in CFRunLoopRunSpecific 
#8 0x0146b161 in CFRunLoopRunInMode 
#9 0x01cd9268 in GSEventRunModal 
#10 0x01cd932d in GSEventRun 
#11 0x003da42e in UIApplicationMain 
#12 0x00002580 in main at main.m:14 

답변

1

애니메이션 멈춘다. 그런 다음 애니메이션은 파괴 된 객체에 메시지를 보내려고합니다.

NSZombieEnabled를 사용하여 실행 파일을 실행하면 objc_MsgSend의 크래시가 Objective-C 예외로 바뀌어 디버거가 중단됩니다.

+0

그러면 dealloc에서 애니메이션을 취소해야 할 것입니다. –