1

UIWebView でクリックされた現在の URL を格納する AppDelegate の変数セットがあります。この変数は、次のように shouldStartLoadWithRequest 関数で設定されます。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {

    NSString *val = [request.URL absoluteString];

    currentURL = val;
    return YES;
}

問題は、アプリケーションの後半で currentURL にアクセスすると、NSString が破棄されているため、EXC_BAD_ACCESS エラーが発生することです。ただし、変数が割り当てられているときに「保持」を追加すると、次のようになります。

NSString *val = [[request.URL absoluteString] retain];

これは、ページが表示されるたびに、解放されない新しい文字列が保持され、メモリ リークが発生することを意味します。これらの保持されたすべての文字列を後で解放するにはどうすればよいですか?

ページの読み込みで問題が発生したときにページがリロードされるように、この値を保存しています。

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
    [ausWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:currentURL]]]
}

私はそれが単純なものだと確信しています。

4

2 に答える 2

0

currentURL がプロパティを保持していると仮定すると、次のようにする必要があります。

NSString *val = [request.URL absoluteString];
[currentURL release];
currentURL = [val retain];

そしてあなたのdeallocで

[currentURL release];

または、合成したときにプロパティを保持した場合は、shouldStartLoadWithRequest で行う必要があるだけです (もちろん、dealloc が必要です):

self.currentURL = [request.URL absoluteString];
于 2012-06-12T06:24:30.320 に答える
0
    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
{

        NSString *val = [request.URL absoluteString];
        if(currentURL)
        {
            [currentURL release];
            currentURL = nil;
        }
        currentURL = [[NSString alloc] initWithString:val];
        return YES;
}
于 2012-06-12T06:24:49.430 に答える