2010-09-10 74 views
8

每當我加載一個新頁面時,顯示加載前頁面的時間很短。如何從UIWebview或dealloc中刪除緩存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; 
} 

回答

10

我對這個問題的解決辦法是在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沒有得到釋放,你應該檢查它的保留數量,並瞭解誰保留它。

+0

什麼是exampleFrame,webViewBed和exampleView?什麼是autoresizingMask?我沒有實現'UIWebViewDelegate'協議,所以我不需要委託。 'addSubview'不適合我,因爲我的'UIViewController'不支持這個。據我所見,你不會在'viewDidDisappear'上發佈web視圖。你只能從超級視圖中刪除它並將其設置爲「nil」。我試過你的方法,我只能看到一個白色的屏幕。我編輯了我的問題,以便您可以看到我的代碼。 – testing 2010-10-03 12:34:42

+0

exampleFrame只是您創建的UIWebView的大小。 webViewBed不應該是這個例子的一部分,它在這個上下文中沒有用。 exampleView是你添加UIWebView的視圖。 當然,您將視圖()添加到視圖,而不是查看控制器。所以你必須做一些像[viewController.view addSubview:...]。 我正在發佈webview,它是一個屬性(請參閱「self。」?),因此您可以將其設置爲零,並將其釋放。 – mips 2010-10-18 21:39:50

+0

完美! 這是我發現工作的互聯網上唯一的解決方案! – Ravikant 2017-02-08 09:56:31

2

如果我不得不作出一個猜測你的web視圖屬性

@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]; 
+0

你說得對。但我不明白,爲什麼保留數爲2會導致webview顯示白屏。感謝您的幫助。我應該給誰檢查標記?這很難... – testing 2010-10-03 18:58:10

+0

我不知道甚至白屏與這個問題有什麼關係。但是如果你有內存管理問題,調試其他問題就很複雜。因此,首先解決內存管理問題,並進一步調查白屏問題。 – 2010-10-03 20:41:56

27

我有幾乎同樣的問題。我想要清除webview緩存,因爲每次我重新加載本地網頁UIWebView時,都會顯示舊網頁。所以我通過設置請求的cachePolicy屬性找到了解決方案。使用NSMutableURLRequest來設置此屬性。所有的一切工作正常重新加載UIWebView

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

希望有幫助!

+0

這解決了我的問題!謝謝 – jithinroy 2010-11-15 09:31:01

+2

這並沒有解決我的問題,無論出於何種原因。我猜這是API中的一個錯誤。 – markshiz 2012-01-25 17:27:49

+0

感謝:「removeAllCachedResponses」不適合我,但這確實。 – user621267 2012-06-08 13:59:54

2

我做了一些簡單的事情,我只是將webView的alpha設置爲0,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秒左右。)

+2

設置阿爾法值刪除緩存?這一定是錯的。 – 2011-08-03 15:17:19

4

如果你想刪除所有緩存的響應,你也可以嘗試這樣的:

[[NSURLCache sharedURLCache] removeAllCachedResponses]; 
0

您也可以加載@「有關:空白」 web視圖消失後,那麼下次訪問它時它將是空的。