2013-02-23 4 views
2

Мое приложение аварийно завершает работу в XCode после холостого хода в течение примерно 5-7 минут. Я уверен, что это как-то связано с анимацией, используемой для экрана загрузки - я вставил код ниже.UIAnimation приводит к сбою XCode после времени

Я попытался включить объекты Zombie, чтобы узнать, был ли это вызов выпущенному объекту и скриншоты окна отладки, когда он разбился.

Кстати - если нажать «Возобновить» приложение продолжает нормально функционировать ..

Edit: это первое. Глобальная точка останова я поставил был остановлен на линии [UIView animateWithDuration:0.2... и это выходной код (это трудно разбился на этот раз):

XYZ(14098,0xac3eaa28) malloc: *** mmap(size=2097152) failed (error code=12) 
*** error: can't allocate region 
*** set a breakpoint in malloc_error_break to debug 2013-02-23 13:19:36.653 XYZ[14098:c07] *** Terminating app due to uncaught exception 'NSMallocException', reason: '*** -[NSObject allocWithZone:]: attempt to allocate object of class 'UIViewAnimationState' failed' 
*** First throw call stack: (0x1cf3012 0x17e8e7e 0x1d7e1a4 0x17fca6b 0x17fca55 0x3acceb 0x3baeec 0x3bb1a7 0x37785 0x3badf6 0x3add66 0x3adf04 0x10fc7d8 0x196d014 0x195d7d5 0x1c99af5 0x1c98f44 0x1c98e1b 0x28f17e3 0x28f1668 0x36fffc 0x28fd 0x2825) libc++abi.dylib: terminate called throwing an exception 

- (void)startAnimating 
{ 
    _isAnimating = YES; 
    float rotationAngle = 360.0/3; 
    [UIView animateWithDuration:0.5 
          delay:0.0 
         options:UIViewAnimationOptionCurveEaseInOut 
        animations:^ 
    { 
     self.marks.transform = CGAffineTransformRotate(self.marks.transform, 
                 ((rotationAngle + 10) * (M_PI/180.0))); 
//  self.marks.transform = CGAffineTransformMakeRotation((rotationAngle + 10) * (M_PI/180.0)); 
    } 
        completion:^(BOOL finished) 
    { 
     [UIView animateWithDuration:0.2 
           delay:0.0 
          options:UIViewAnimationOptionCurveEaseInOut 
         animations:^ 
     { 
      self.marks.transform = CGAffineTransformRotate(self.marks.transform, 
                  -10 * (M_PI/180.0)); 
//   self.marks.transform = CGAffineTransformMakeRotation(-10 * (M_PI/180.0)); 
     } 
         completion:^(BOOL finished) 
     { 
      self.marks.transform = CGAffineTransformIdentity; 
      [self startAnimating]; 
     }]; 
    }]; 
} 

скриншот, когда он разбился нормально:

Screenshot with NSZombieObjects disabled

Снимок экрана, когда NSZombieObjects разрешен:

Screenshot with NSZombieObjects enabled

+3

Было бы более удобно установить это вручную как повторяющееся 'CAKeyframeAnimation', но отложив это в сторону, при догадках: что произойдет, если вы переключите' [self startAnimating] 'на' [self performSelector: @selector (startAnimating) withObject: nil afterDelay: 0.0] '- просто чтобы исключить возможность того, что старая внутренняя модальная настройка для блоков анимации не сработает, когда вы пытаетесь создать новую в обратном вызове из старой. – Tommy

+0

Спасибо за ваше предложение. После изменения кода для выполнения селектора я все равно получаю сбой - хотя теперь журнал немного отличается: [link] (http://i.imgur.com/u3MYE9h.png). Не использовал Keyframeanimation раньше, прочитает на нем. –

ответ

1

Завершение блока вашей второй анимации рекурсивного вызова startAnimating. Я думаю, что это и есть причина проблемы. Вы должны использовать цикл или создать повторяющуюся анимацию.

+0

Удаление рекурсивного вызова startAnimating и добавление 'options: UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionRepeat', похоже, исправил проблему. Однако способ работы с загрузкой - это просто скрывать и показывать, когда это необходимо. Я обнаружил, что мне также пришлось вручную «removeAllAnimation's» и вызвать startAnimating в вызовах метода hide/show, иначе, когда он будет показан снова, он не будет анимироваться. –

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