Как я рухнул в блоке @ try / @ catch? - PullRequest
2 голосов
/ 22 марта 2012

Я получил следующий отчет о сбое (усеченный)

Exception Type:  EXC_CRASH (SIGSEGV)
Exception Codes: 0x00000000, 0x00000000
Crashed Thread:  0

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libsystem_kernel.dylib          0x36df00d8 __psynch_mutexwait + 24
1   libsystem_c.dylib               0x31760674 pthread_mutex_lock + 376
2   CoreFoundation                  0x31f2338a CFRunLoopWakeUp + 50
3   WebCore                         0x308d0bc8 _WebThreadRun + 284
4   UIKit                           0x37921c7a -[UIWebDocumentView _runLoadBlock:] + 38
5   UIKit                           0x37921c3a -[UIWebDocumentView _cleanUpFrameStateAndLoad:] + 114
6   UIKit                           0x37921bbe -[UIWebDocumentView loadHTMLString:baseURL:] + 78

Проблема в том, что вызывающий код выглядит так:

@try {
    [webView loadHTMLString:htmlString baseURL:nil];
    [webView setNeedsDisplay];     
}
@catch (NSException *exception) {...}

Итак, как мне удалось вызвать исключение из обработчика исключений?

Я не вызывал метод броска изнутри catch. Все, что я делаю, - это вывод в NSLog исключения, webView и htmlString. Если бы они вызывали исключение, я бы ожидал, что аварийный стек будет выглядеть по-другому.

Похоже ли это на потенциальную ошибку ОС?

1 Ответ

8 голосов
/ 22 марта 2012

Это ошибка сегментации (SIGSEGV) , не исключение.

Эти ошибки не являются исключениями, то есть вы не можете использовать блок try / catch.

Ошибка сегментации означает, что вы пытаетесь получить доступ к области памяти, которая не принадлежит вашему приложению.

В вашем случае это могут быть автоматически освобожденные объекты, которые освобождаются, а затем к ним обращаются (указатель больше недействителен, поскольку объект был освобожден).

Убедитесь, что ваша переменная htmlString все еще указывает на допустимый объект ...

Кстати, я не думаю, что вызов setNeedsDisplay необходим после использования loadHTMLString.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...