0

私はiosアプリケーションを持っています。一部のビュー コントローラーには Web ビューが含まれています。1つの問題を除いて、すべてがうまく機能します:

アプリケーションを起動して数分間使用せずに作業を続けると、正常に動作しますが、webview で viewcontroller をロードしようとすると、SIGKILLエラーでクラッシュします。いくつかの休憩の後、他のViewControllerに問題はありません。これが私がwebviewsに使用するコードです:

_webView = [[UIWebView alloc] initWithFrame:self.view.bounds)];
[self.view addSubview:_webView];
_webView.userInteractionEnabled = NO;
[_webView release];
// here is the local page, the same happens if i load internet page..
NSString *path = [[NSBundle mainBundle] pathForResource:@"localpage" ofType:@"html"];
_url = [NSURL fileURLWithPath:path];
[_webView loadRequest:[NSURLRequest requestWithURL:_url]];

問題は、なぜアプリケーションがクラッシュした後、webviews を含む viewcontrollers をロードしようとしてクラッシュするのかということです。

ありがとう。

4

1 に答える 1

3

あなたのコードは非常に危険です:

_webView = [[UIWebView alloc] initWithFrame:self.view.bounds)];
[self.view addSubview:_webView];
_webView.userInteractionEnabled = NO;
[_webView release];

私はそれ_webViewがivarだと思います。まず、init と dealloc 以外で ivar に直接アクセスしないでください。ivar への直接アクセスは、クラッシュの最大の原因です。それを間違って行うのはあまりにも簡単で、ここで間違っている. 完了する前に ivar を解放しています。あなたはそれを保持するビューに賭けていますが、それは起こるかもしれないし、起こらないかもしれません. たとえば、ビューがアンロードされた場合 (画面外にいるときに発生する可能性があります)、_webViewダングリング ポインターになります。ここでの正しいコードは次のとおりです (webViewretainプロパティであると仮定します)。

self.webView = [[[UIWebView alloc] initWithFrame:self.view.bounds)] autorelease];
[self.view addSubview:self.webView];
self.webView.userInteractionEnabled = NO;

このコードの外部に_urlアクセスするとクラッシュする可能性があります。_url繰り返しますが、アクセサーに切り替えると修正されます。

self.url = [NSURL fileURLWithPath:path];
[self.webView loadRequest:[NSURLRequest requestWithURL:self.url]];

この問題や他の多くの問題は、ARC に切り替えると非常に簡単に解消されることに注意してください。ARC コードは、記述が簡単でクラッシュが少ないだけでなく、ほとんどの場合、同等に正しく記述された手動のメモリ管理よりも高速です。iPhoneOS 3 をサポートする必要がない限り、絶対に ARC に切り替える必要があります。

于 2012-07-21T18:34:16.103 に答える