CADisplayLink проглатывает исключения - PullRequest
4 голосов
/ 12 апреля 2011

Я заметил, что при использовании 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?Есть ли способ заставить ее прервать работу программы, когда исключение всплывает, а не раскручивает стек и делает вид, что ничего не произошло?

1 Ответ

2 голосов
/ 12 апреля 2011

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

Единственный способ сделать то, что вы спрашиваете, насколько я знаю,

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

Не сильно помогаю, я знаю. Две другие вещи, которые могут помочь:

...