【问题标题】:How to delete the cache from UIWebview or dealloc UIWebview如何从 UIWebview 或 dealloc UIWebview 中删除缓存
【发布时间】:2010-09-10 09:39:45
【问题描述】:

每次我使用UIWebView 加载新页面时,之前加载的页面都会显示一小段时间。

如何清除该缓存?另一种可能性是解除分配UIWebview。我试过了,但我的UIWebView 总是“空”的。这种情况下allocdealloc应该怎么做?

我注意到UIWebView 正在消耗大约 10 MB RAM。现在UIWebViewViewController 一起加载。视图是自动发布的,UIWebView 是自动发布的。每次释放 WebView 不是更好吗?

解决方案:

- (void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    CGRect frame = CGRectMake(0, 0, 320, 480);
    self.webView = [[[UIWebView alloc]initWithFrame:frame] autorelease];
    self.webView.scalesPageToFit = YES;
    [self.view addSubview:self.webView];
}

- (void) viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];

    [self.webView removeFromSuperview];
    self.webView = nil;
}

【问题讨论】:

    标签: iphone objective-c cocoa-touch uiwebview


    【解决方案1】:

    我几乎遇到了同样的问题。我希望清除 webview 缓存,因为每次我在 UIWebView 中重新加载本地网页时,都会显示旧网页。所以我通过简单地设置请求的cachePolicy 属性找到了解决方案。使用NSMutableURLRequest 设置此属性。一切正常,重新加载UIWebView

    NSURL *url = [NSURL fileURLWithPath:MyHTMLFilePath]; 
     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
     [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
     [self.webView loadRequest:request];
    

    希望有帮助!

    【讨论】:

    • 无论出于何种原因,这都没有解决我的问题。我猜这是 API 中的错误。
    • 谢谢:“removeAllCachedResponses”对我不起作用,但它确实起作用了。
    • 如果我使用 loadHtmlString 会怎样?每次加载HtmlString时如何清除缓存?
    • 仅适用于 [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];和 [_webView loadRequest:request];我的 UIWebView 没有重新加载页面。我必须添加 [_webView reload];
    【解决方案2】:

    我对此问题的解决方案是在viewWillAppear: 上以编程方式创建UIWebView 并在viewDidDisappear: 上发布它,如下所示:

    - (void) viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
    
        self.webView = [[[UIWebView alloc]initWithFrame:exampleFrame] autorelease];
        self.webView.scalesPageToFit = YES;
        self.webView.delegate = self;
        self.webView.autoresizingMask = webViewBed.autoresizingMask;
        [exampleView addSubview:self.webView];
    }
    - (void) viewDidDisappear:(BOOL)animated {
        [super viewDidDisappear:animated];
    
        [self.webView removeFromSuperview];
        self.webView.delegate = nil;
        self.webView = nil;
    }
    

    如果您这样做并且您的 UIWebView 没有被释放,您应该检查它的保留计数并了解谁在保留它。

    【讨论】:

    • 什么是exampleFrame、webViewBed和exampleView?什么是 autoresizingMask?我没有实现UIWebViewDelegate 协议,所以我不需要委托。 addSubview 不适合我,因为我的 UIViewController 不支持这个。据我所知,您没有在viewDidDisappear 上发布网络视图。您只需将其从超级视图中删除并将其设置为nil。我试过你的方法,我只能看到一个白屏。我编辑了我的问题,以便您可以查看我的代码。
    • exampleFrame 只是您正在创建的 UIWebView 的大小。 webViewBed 不应该是这个例子的一部分,它在这个上下文中没有用。 exampleView 是将 UIWebView 添加到的视图。当然,你 addSubview()s 到视图,而不是视图控制器。所以你必须做类似 [viewController.view addSubview:...] 的事情。我正在发布 webview,它是一个属性(参见“self.”?),因此您可以将其设置为 nil,它会被释放。
    • 完美!!这是我在互联网上发现的唯一可行的解​​决方案!
    【解决方案3】:

    如果您想删除所有缓存的响应,您可能还想尝试这样的事情:

    [[NSURLCache sharedURLCache] removeAllCachedResponses];
    

    【讨论】:

      【解决方案4】:

      如果我不得不猜测你的 webView 属性是

      @property (nonatomic, retain) IBOutlet UIWebView *webView;
      

      对吗?重要的部分是保留。

      self.webView = [[UIWebView alloc]initWithFrame:frame];
      

      上面的代码分配了一个UIWebView(意思是retainCount = 1),然后把它添加到self.webView中,在这里又被保留了(retainCount = 2)。

      将代码更改为以下内容,您的 webView 应该会被释放。

      self.webView = [[[UIWebView alloc]initWithFrame:frame] autorelease];
      

      addSubview:只能在 UIViews 上调用。

      //[self.navigationController addSubview:self.webView];
      

      应该是

      [self.navigationController.view addSubview:self.webView];
      

      【讨论】:

      • 你是对的。但我不明白为什么保留计数为 2 会导致 webview 显示白屏。感谢您的帮助。我应该给谁打勾?这很难......
      • 我不知道白屏是否与此问题有关。但是,如果您还有内存管理问题,那么调试其他问题会很复杂。所以首先修复内存管理并进一步调查白屏问题。
      【解决方案5】:

      我做了一些更简单的事情,我只是将 webView 的 alpha 在 loadRequest 上设置为 0,在 webViewDidFinishLoad 上设置为 1。

      thewebview.alpha=0.0;
      thewebview.backgroundColor=[UIColor whiteColor];
      [thewebview loadRequest:[NSURLRequest requestWithURL:url(str)]];
      

      - (void)webViewDidFinishLoad:(UIWebView *)webView {
          thewebview.alpha=1.0;
      }
      

      (实际上我有一个淡入,因为渲染 f.ex. PDF 可能需要 1/5 秒左右。)

      【讨论】:

        【解决方案6】:

        你也可以在webview消失后加载@"about:blank",下次访问时它就会为空。

        【讨论】:

          猜你喜欢
          • 2017-02-03
          • 2013-02-09
          • 2011-02-01
          • 2011-07-25
          • 1970-01-01
          • 1970-01-01
          • 2013-07-24
          • 1970-01-01
          相关资源
          最近更新 更多