我注意到在使用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的正确行为吗?有没有办法让它在出现异常时中止程序,而不是解开堆栈,假装什么都没发生?
发布于 2011-04-12 12:23:37
我怀疑CoreAnimation的C++内部(如回溯所示)负责您已经注意到的异常吞噬(或者更确切地说,我认为NSTimer不会吞噬异常);CoreAnimation回调(从+[UIView setAnimationDidFinishSelector:]调用,甚至在动画时从-viewDidAppear:调用)似乎也做了同样的事情,只是我认为它们打印了一条日志消息。我不确定为什么苹果选择吞噬异常而不是异常处理;哦,好吧。
据我所知,做你要求的事的唯一方法是,
@try
{
...
}
@catch(...)
{
abort();
}我知道,帮不上什么忙。另外两件事可能会有帮助:
https://stackoverflow.com/questions/5629478
复制相似问题