このエントリーをはてなブックマークに追加このエントリをつぶやく

iOS 5のUIWebView

iOS 5がリリースされましたね。新機能が魅力的な一方で、既存のアプリにトラブルが出て苦労している方もいるようです。そんなトラブルの一つをご紹介します。

Xcode 4.2をダウンロードして、既存のアプリをiOS 5 Simulatorで起動したところ、特定の場所で必ずクラッシュするようになっていました。スタックトレースはmain関数を指していて役に立ちません。
怪しい部分をコメントアウトしては実行するのを繰り返し、原因となっている箇所を絞り込んでいきました。どうやらUIWebViewにHTMLを読み込ませた後、システム内部の非同期処理で落ちているようです。

いろいろ試した結果、下記の最小コードでクラッシュすることがわかりました。

[ccN_objc]
webView_ = [[UIWebView alloc] initWithFrame:CGRectZero];
webView_.frame = CGRectMake(0, 0, 0, 460);
[webView_ loadHTMLString:@”Hello” baseURL:nil];
[/ccN_objc]

  1. CGRectZero で初期化する
  2. frame プロパティに width=0 かつ height>0 のCGRectをセットする
  3. HTMLを読み込ませる

どれが欠けても再現しません。逆に言えば、初期化するときに width>0 または height>0 のCGRectを渡すことで回避できます。
今回は動的に UIWebView の表示領域を変えるアプリだったため、不幸にも条件を満たしてしまったというわけです。

この地雷を踏んだ人が世界に何人いるのかわかりませんが、お役に立てれば幸いです。

追記: 実機では再現しないようです…

カテゴリー: プログラミング   タグ: , ,   この投稿のパーマリンク

コメントは受け付けていません。