CADisplayLink сглатывает исключения

Я заметил, что при использовании CADisplayLink исключения просто проглатываются:

CADisplayLink *aDisplayLink = [[UIScreen mainScreen] displayLinkWithTarget:self selector:@selector(doIt)]; [aDisplayLink setFrameInterval:100]; [aDisplayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; ... - (void) doIt { NSLog(@"Before"); // Force an exception NSLog(@"%@", [[NSArray array] objectAtIndex:1]); NSLog(@"After"); } 

Запуск этого кода дает следующий результат:

 2011-04-11 18:30:36.001 TestFrameLink[10534:207] Before 2011-04-11 18:30:37.666 TestFrameLink[10534:207] Before 2011-04-11 18:30:39.333 TestFrameLink[10534:207] Before 

Это правильное поведение для CADisplayLink? Есть ли способ отключить программу, когда исключение пузырится, а не разматывать стек и притворяться, что ничего не произошло?

Я подозреваю, что внутренняя среда CoreAnimation C ++ (как показано в backtraces) несут ответственность за исключение-глотание, которое вы заметили (точнее, я не думаю, что NSTimer проглатывает исключения); Обратные вызовы CoreAnimation (называемые из +[UIView setAnimationDidFinishSelector:] или, возможно, даже -viewDidAppear: при анимированном), похоже, делают то же самое, за исключением того, что я думаю, что они напечатали сообщение журнала. Я не уверен, почему выбранное вами исключение выбрало исключение – исключая обработку исключений; Ну что ж.

Насколько мне известно, единственный способ сделать то, что вы просите,

 @try { ... } @catch(...) { abort(); } 

Я не знаю, что это такое. Еще две вещи, которые могут помочь:

  • Почему UIScrollView приостанавливает мой CADisplayLink?
  • Сколько способов рассчитать FPS (кадры в секунду) приложения iOS программно?
  • Как правильно остановить и возобновить CADisplayLink?
  • CADisplayLink заикается при построении из архива
  • UIScrollView сломан и останавливает прокрутку с помощью рендеринга OpenGL (связанный CADisplayLink, NSRunLoop)
  • CADisplayLink и drawRect
  • Как установить желаемую частоту рендеринга (FPS) в приложении iOS?
  • Давайте будем гением компьютера.