4

我注意到在使用 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 的正确行为吗?有没有办法让它在异常冒泡时中止程序,而不是展开堆栈并假装什么也没发生?

4

1 回答 1

2

我怀疑 CoreAnimation 的 C++ 内部结构(如回溯中所证明的那样)是造成您注意到的异常吞咽的原因(或者更确切地说,我认为 NSTimer 不会吞咽异常);CoreAnimation 回调(从动画中调用+[UIView setAnimationDidFinishSelector:]或什至可能-viewDidAppear:在动画时调用)似乎做同样的事情,除了我认为它们打印了一条日志消息。我不确定为什么 Apple 选择异常吞咽而不是异常处理;那好吧。

据我所知,做你所要求的唯一方法是,

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

没有多大帮助,我知道。另外两件事可能会有所帮助:

于 2011-04-12T04:23:36.903 回答