は、私が(切り捨て)以下のクラッシュレポートを受け取っ@ try/@ catchブロックでどのようにクラッシュしましたか?
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) {...}
だから、どのように私は例外の中から例外をスローするように管理しましたハンドラ?
私はキャッチの中から投げる方法を呼び出さなかった。私がそこでやっているのは、NSLogに例外、webView、およびhtmlStringをダンプすることだけです。彼らが例外を引き起こしていたなら、私はクラッシュスタックが異なって見えると思うでしょう。
これは潜在的なOSのバグを減らしているようですか?
これは意味があります。呼び出しは、死にかけているスレッドから呼び出される関数内にあります。私はメソッドがメインスレッド上で自分自身を呼び出すことを確認するためにメソッドを保護しました。これは、スレッドに送信された文字列が、スレッド終了した呼び出し元のまま終了し、自身をクリーンアップすることを保証するものではありません。特にこれに感謝します。 segfaultは例外処理で捕まえることができると思いました。私はその知識に感謝します。 –
セグメンテーションフォールトは信号で、OSによってアプリケーションに送信されます。これらは、シグナルハンドラによって「捕まえられる」ことができます(signal()関数を参照)。セグメンテーションフォールトはシグナルハンドラで管理することができますが、デバッグを除いて、アプリケーションが矛盾した状態になるので、通常はそれを実行することをお勧めしません。 – Macmade