Ответ уже принят, но я отмечу для всех, кто сталкивался с этим вопросом, что, хотя вы не должны использовать его для обычной обработки оповещений, в некоторых случаях вы можете помешать продолжению текущего пути выполненияво время представления предупреждения.Для этого вы можете запустить цикл выполнения для основного потока.
Я использую этот подход для обработки фатальных ошибок, которые я хочу представить пользователю перед сбоем.В таком случае произошло что-то катастрофическое, поэтому я не хочу возвращаться к методу, который вызвал ошибку, которая может привести к выполнению другого кода с недопустимым состоянием и, например, к поврежденным данным.
Обратите внимание, что это не помешает обработке событий и не заблокирует запуск других потоков, но, поскольку мы представляем предупреждение, которое по существу перехватывает интерфейс, события обычно должны быть ограничены этим предупреждением.
// Present a message to the user and crash
-(void)crashNicely {
// create an alert
UIAlertView *alert = ...;
// become the alert delegate
alert.delegate = self;
// display your alert first
[alert show];
// spin in the run loop forever, your alert delegate will still be invoked
while(TRUE) [[NSRunLoop currentRunLoop] runUntilDate:[NSDate distantFuture]];
// this line will never be reached
NSLog(@"Don't run me, and don't return.");
}
// Alert view delegate
- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex {
abort(); // crash here
}