甘いものが好きです

iOS App開発時に感じた疑問や課題、その他の雑感などを書いていきます。

UIWebViewの使用上の簡単な注意

UIWebViewを使用する上での簡単な注意点をいくつか。

UIWebViewオブジェクトはリリース前にdelegateにnilを設定しておくこと

リリース前にdelegateにnilを設定しておく必要があるのは、次のページで詳細に説明されているように、UIWebViewのロード処理が別スレッドで行われていることが関係しているためであるようだ。
[iPhone] UIWebView のリリース前に delegate に nil をセットする必要がある | Sun Limited Mt.

iPhoneプログラミングUIKit詳解リファレンス」ではさらに、リリース直前にロード処理を中止している。

- (void)dealloc {
    if (webView.loading) {
        [webView stopLoading];
    }
    webView.delegate = nil;
    [webView release];
}

iPhoneプログラミングUIKit詳解リファレンス

iPhoneプログラミングUIKit詳解リファレンス

webView:didFailLoadWithError:呼び出し時の処理について

webView:didFailLoadWithError:がコールされたときに、エラー情報をAlertViewで表示しようとすると、第2引数から取得できるエラードメインがNSURLErrorDomain、エラーコードが-999である場合があることに気がつく。これは最初のリクエストが処理中のときに次のリクエストが発生した場合に起こる。エラーコードの-999はNSError.hで定義されているNSURLErrorCanceledのことである。NSURLErrorCanceledという名前からも推測できるように、このエラーコードはそれ以前に発行されたリクエストがキャンセルされたことを示す。

たいていの場合には、後続のリクエストが正常に処理されれば問題ないため、NSURLErrorCanceledのエラーはAlertViewで表示する必要はない。そのため、エラー情報をAlertViewで表示する場合には、NSURLErrorCanceledを除外して次のようにするのがよい。

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
    if ([error code] != NSURLErrorCancelled) {
        NSString *message = [error localizedDescription];
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"エラー発生" 
                                                        message:message 
                                                       delegate:self 
                                              cancelButtonTitle:nil 
                                              otherButtonTitles:@"OK", nil];
        [alert show];
        [alert release];
    }
}