iOS5 で UIWebView を使用しているときはご注意-予期せぬクラッシュを防ぐ方法

追記:2012/5/11 こちらの記事に更なる対策を書きました。この記事の内容だけで十分ではないみたいでした。UIWebView がクラッシュするのを防ぐ方法−2 | Zero4Racer PRO Developer’s Blog
iPad向け、Twitter 俯瞰(一望)アプリ、TweetOverviewの開発も終盤に迫ってきました。現在、クラッシュの原因などをつぶしているところです。スクリーンショットはこちら。

詳細画面
詳細画面

こちらが詳細です。
一覧画面
一覧画面

一覧から、クリックすると、詳細が表示され、リンクが有れば詳細が表示されます。
Webviewを表示
Webviewを表示

ここでWebViewを使用しているのですが、ときどき落ちる現象が発生していました。

クラッシュで落ちるのですが、クラッシュレポートは以下のような感じでした。

Incident Identifier: 1EF46E57-4785-4434-A1DE-0E640AB9E6ED
CrashReporter Key: 92d191278ae2cc8971ec7375ba2d01242246f856
Hardware Model: iPad3,3
Process: TwitOverview [13214]
Path: /var/mobile/Applications/9BA9102E-ACB3-4573-B319-EEE6E3A080AA/TwitOverview.app/TwitOverview
Identifier: TwitOverview
Version: ??? (???)
Code Type: ARM (Native)
Parent Process: launchd [1]

Date/Time: 2012-04-12 09:01:23.277 -0700
OS Version: iPhone OS 5.1 (9B176)
Report Version: 104

Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00000000
Crashed Thread: 2

Thread 2 name: WebThread
Thread 2 Crashed:
0 libicucore.A.dylib 0x3493e68c 0x348cf000 + 456332
1 libicucore.A.dylib 0x348e0b98 utext_next32 + 28
2 libicucore.A.dylib 0x348d7d02 icu::RuleBasedBreakIterator::handleNext(icu::RBBIStateTable const*) + 834
3 libicucore.A.dylib 0x348d799e icu::RuleBasedBreakIterator::next() + 70
4 libicucore.A.dylib 0x348d7248 icu::RuleBasedBreakIterator::following(int) + 152
5 WebKit 0x326cf754 -[NSString(WebStringDrawing) __web_drawInRect:withFont:ellipsis:alignment:letterSpacing:lineSpacing:includeEmoji:truncationRect:measureOnly:renderedStringOut:drawUnderline:] + 1192
6 WebKit 0x32648078 -[NSString(WebStringDrawing) __web_drawInRect:withFont:ellipsis:alignment:letterSpacing:lineSpacing:includeEmoji:truncationRect:measureOnly:renderedStringOut:] + 108
7 WebKit 0x32647ffc -[NSString(WebStringDrawing) __web_drawInRect:withFont:ellipsis:alignment:letterSpacing:lineSpacing:includeEmoji:truncationRect:measureOnly:] + 100
8 WebKit 0x32647f88 -[NSString(WebStringDrawing) _web_drawInRect:withFont:ellipsis:alignment:lineSpacing:includeEmoji:truncationRect:measureOnly:] + 100
9 WebKit 0x32647f14 -[NSString(WebStringDrawing) _web_sizeInRect:withFont:ellipsis:lineSpacing:] + 80
10 UIKit 0x32812804 -[NSString(UIStringDrawing) sizeWithFont:constrainedToSize:lineBreakMode:lineSpacing:] + 108
11 UIKit 0x327fa194 -[UILabel _drawTextInRect:baselineCalculationOnly:] + 720
12 UIKit 0x327f9586 -[UILabel drawTextInRect:] + 374
13 UIKit 0x327f9406 -[UILabel drawRect:] + 66
14 UIKit 0x327f9306 -[UIView(CALayerDelegate) drawLayer:inContext:] + 270
15 QuartzCore 0x30c3d4de -[CALayer drawInContext:] + 110
16 QuartzCore 0x30c3cb38 CABackingStoreUpdate_ + 1776
17 QuartzCore 0x30c3c32e CA::Layer::display_() + 950
18 QuartzCore 0x30c3bf5a CA::Layer::display() + 122
19 QuartzCore 0x30c3be9c CA::Layer::display_if_needed(CA::Transaction*) + 168
20 QuartzCore 0x30c3b844 CA::Context::commit_transaction(CA::Transaction*) + 228
21 QuartzCore 0x30c3b578 CA::Transaction::commit() + 308
22 QuartzCore 0x30c334b2 CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 50
23 CoreFoundation 0x31c35b14 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 12
24 CoreFoundation 0x31c33d50 __CFRunLoopDoObservers + 252
25 CoreFoundation 0x31bb74ba CFRunLoopRunSpecific + 322
26 CoreFoundation 0x31bb7366 CFRunLoopRunInMode + 98
27 WebCore 0x334cb0f0 _ZL12RunWebThreadPv + 396
28 libsystem_c.dylib 0x3138672e _pthread_start + 314
29 libsystem_c.dylib 0x313865e8 thread_start + 0

これが、読み込み中に、必ずではなく、ときどき起きるので、困っていたのですが、どうも、閉じてしまったWebviewに、メッセージが送られているっぽい感じなので、以下の様に対処しました。


- (void) viewDidDisappear:(BOOL)animated {
LOG_METHOD;
[_webView stopLoading];
[_webView.layer removeAllAnimations];
[_webView removeFromSuperview];
_webView.delegate = nil;
[super viewDidDisappear:animated];
}

アニメーションも発行している可能性があるので、

  1. 読み込みの中止、
  2. アニメーションの中止
  3. DelegateをNilに
  4. Viewから削除

して上げたら正しく表示する容易なりました。

もし、TweetOverview テストに参加したい方がおられましたらこちらまで。
TestFlight » JTECH Beta Invitation

「iOS5 で UIWebView を使用しているときはご注意-予期せぬクラッシュを防ぐ方法」への2件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください