2010-09-10 32 views
8

Mỗi khi tôi tải một trang mới với UIWebView trang được tải trước sẽ được hiển thị trong một thời gian ngắn.Cách xóa bộ nhớ cache khỏi UIWebview hoặc dealloc UIWebview

Làm cách nào để xóa bộ nhớ cache đó? Một khả năng khác là để giải quyết UIWebview. Tôi đã thử nhưng hơn UIWebView của tôi luôn là "trống". Làm thế nào để allocdealloc được thực hiện trong trường hợp này?

Tôi nhận thấy rằng UIWebView tiêu thụ khoảng 10 MB RAM. Bây giờ, UIWebView được tải cùng với ViewController. Và chế độ xem được tự động phát hành cũng như UIWebView được tự động phát hành. Nó sẽ không được tốt hơn để dealloc WebView mỗi lần?

Giải pháp:

- (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; 
} 

Trả lời

10

Giải pháp của tôi cho vấn đề này là tạo ra các UIWebView lập trình trên viewWillAppear: và để phát hành nó trên viewDidDisappear:, như thế này:

- (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; 
} 

Nếu bạn làm điều này và UIWebView của bạn không được phát hành, bạn nên kiểm tra xem nó có được giữ lại và hiểu ai đang giữ lại nó hay không.

+0

ExampleFrame, webViewBed và exampleView là gì? AutoresizingMask là gì? Tôi không thực hiện giao thức 'UIWebViewDelegate' vì vậy tôi không cần đại biểu. 'addSubview' không hoạt động với tôi, bởi vì' UIViewController' của tôi không hỗ trợ điều này. Theo tôi có thể thấy bạn không phát hành chế độ xem web trên 'viewDidDisappear'. Bạn chỉ xóa nó khỏi phần giám sát và đặt nó thành 'nil'. Tôi đã thử cách tiếp cận của bạn và tôi chỉ có thể nhìn thấy một màn hình trắng. Tôi đã chỉnh sửa câu hỏi của tôi để bạn có thể xem mã của tôi. – testing

+0

exampleFrame chỉ là kích thước của UIWebView bạn đang tạo. webViewBed không phải là một phần của ví dụ này, nó không hữu ích trong ngữ cảnh này. exampleView là chế độ xem bạn đang thêm UIWebView vào. Và tất nhiên, bạn thêmSubview() s vào dạng xem, không phải để xem bộ điều khiển. Vì vậy, bạn sẽ phải làm một cái gì đó như [viewController.view addSubview: ...]. Tôi đang phát hành webview, đó là một tài sản (xem "tự".?) Vì vậy, bạn có thể thiết lập nó để nil và nó sẽ được phát hành. – mips

+0

Hoàn hảo !! Đây là giải pháp duy nhất trên internet mà tôi tìm được để làm việc !! – Ravikant

2

Nếu tôi bị buộc phải đoán tài sản của bạn cho WebView là

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

có đúng không? Phần quan trọng là giữ lại.

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

Mã trên phân bổ một UIWebView (có nghĩa là retainCount = 1) và sau đó thêm nó vào self.webView, nơi nó được giữ lại (retainCount = 2).

Thay đổi mã thành mã sau và chế độ xem web của bạn sẽ được deallocated.

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

addSubview: Chỉ có thể gọi vào UIViews.

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

nên

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

Bạn nói đúng. Nhưng tôi không hiểu rằng tại sao số lượng người giữ lại 2 khiến cho webview hiển thị một màn hình trắng. Cảm ơn sự giúp đỡ của bạn. Tôi nên cho ai đánh dấu? Rất khó ... – testing

+0

Tôi không biết điều gì hoặc thậm chí nếu màn hình trắng có liên quan đến vấn đề này. Nhưng nếu bạn có vấn đề về quản lý bộ nhớ, nó phức tạp để gỡ lỗi các vấn đề khác. Vì vậy, trước tiên hãy sửa lỗi quản lý bộ nhớ và điều tra thêm về vấn đề màn hình trắng. –

27

tôi đã gần như cùng một vấn đề. Tôi muốn xóa bộ nhớ cache trên webview vì mỗi lần tôi tải lại trang web địa phương theo số UIWebView, bộ nhớ cache cũ được hiển thị. Vì vậy, tôi đã tìm thấy giải pháp bằng cách chỉ cần đặt thuộc tính cachePolicy của yêu cầu. Sử dụng số NSMutableURLRequest để đặt thuộc tính này. Với tất cả mọi thứ hoạt động tốt với tải lại UIWebView.

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

Hy vọng điều đó sẽ hữu ích!

+0

điều này giải quyết prob của tôi! cảm ơn – jithinroy

+2

điều này đã không giải quyết vấn đề của tôi vì lý do gì. Tôi đoán đó là một lỗi trong API. – markshiz

+0

Cảm ơn: "removeAllCachedResponses" không hoạt động đối với tôi nhưng điều này đã làm. – user621267

2

Tôi đã làm điều gì đó đơn giản hơn, tôi chỉ đặt alpha của webView thành 0 trên loadRequest và 1 trên webViewDidFinishLoad.

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

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

(Thật sự tôi có một fade-in, như render f.ex. một PDF có thể mất 1/5 giây hoặc lâu hơn.)

+2

Đặt giá trị alpha có xóa bộ đệm không? Điều đó phải sai. –

4

Nếu bạn muốn xóa tất cả câu trả lời được lưu trong bộ nhớ cache, bạn cũng có thể muốn thử một số nội dung như sau:

[[NSURLCache sharedURLCache] removeAllCachedResponses]; 
0

Bạn cũng có thể tải @ "about: blank" sau khi webview biến mất, sau đó nó sẽ trống trong lần tiếp theo bạn truy cập nó.

Các vấn đề liên quan