Мой NSTimer встроен в класс, который воспроизводит последовательности изображений. В основном это зацикливает и изменяет UIImageView. Все идет хорошо, если я позволю последовательности изображений закончить, но ... сам по себе, если я пытаюсь остановить таймер во время его воспроизведения, я получаю sigabrt. Edit: больше не sigabrt, но теперь DeAlloc я не могу объяснить.
«Стоп» в конце последовательности кадров - это та же самая остановка, которую я называю средней последовательностью.
Так что может заставить NSTimer нарушать среднюю функцию и DeAlloc. Более того, на что я мог бы обратить внимание, чтобы исправить это.
Спасибо.
Я использую пример кода здесь: http://www.modejong.com/iOS/PNGAnimatorDemo.zip
Редактировать: Я добавлю сюда, как мне кажется, соответствующий код.
// Вызовите этот метод для запуска анимации
- (void) startAnimating
{
self.animationTimer = [NSTimer timerWithTimeInterval: animationFrameDuration target: self selector: @selector(animationTimerCallback:) userInfo: NULL repeats: TRUE];
[[NSRunLoop currentRunLoop] addTimer: animationTimer forMode: NSDefaultRunLoopMode];
animationStep = 0;
if (avAudioPlayer != nil)
[avAudioPlayer play];
// Send notification to object(s) that regestered interest in a start action
[[NSNotificationCenter defaultCenter]
postNotificationName:ImageAnimatorDidStartNotification
object:self];
}
- (void) animationTimerCallback: (NSTimer *)timer {
if (![self isAnimating])
return;
NSTimeInterval currentTime;
NSUInteger frameNow;
if (avAudioPlayer == nil) {
self.animationStep += 1;
// currentTime = animationStep * animationFrameDuration;
frameNow = animationStep;
} else {
currentTime = avAudioPlayer.currentTime;
frameNow = (NSInteger) (currentTime / animationFrameDuration);
}
// Limit the range of frameNow to [0, SIZE-1]
if (frameNow < 0) {
frameNow = 0;
} else if (frameNow >= animationNumFrames) {
frameNow = animationNumFrames - 1;
}
[self animationShowFrame: frameNow];
// animationStep = frameNow + 1;
if (animationStep >= animationNumFrames) {
[self stopAnimating];
// Continue to loop animation until loop counter reaches 0
if (animationRepeatCount > 0) {
self.animationRepeatCount = animationRepeatCount - 1;
[self startAnimating];
}
}
}
- (void) stopAnimating
{
if (![self isAnimating])
return;
[animationTimer invalidate];
self.animationTimer = nil;
animationStep = animationNumFrames - 1;
[self animationShowFrame: animationStep];
if (avAudioPlayer != nil) {
[avAudioPlayer stop];
avAudioPlayer.currentTime = 0.0;
self->lastReportedTime = 0.0;
}
// Send notification to object(s) that regestered interest in a stop action
[[NSNotificationCenter defaultCenter]
postNotificationName:ImageAnimatorDidStopNotification
object:self];
}
Edit2: Поэтому я закомментировал NSAssert в DeAlloc, комментируя, что пролил немного больше света. Теперь добираемся до self.animationTimer = nil;
и говорим *** -ImageAnimator setAnimationTimer:]: Message sent to deallocated instance.
DeAlloc вызывается правильно, когда я делаю таймер недействительным ... поэтому я немного запутался здесь.