2015-01-12 13 views
7

Mặc dù có nhiều cuộc thảo luận về chủ đề này, tôi vẫn chưa tìm thấy câu trả lời.rò rỉ bộ nhớ UIWebView. Ma thuật giải phóng tài nguyên không sử dụng là gì?

Vấn đề là, sau khi UIWebView tải một trang, nó sẽ không bao giờ giải phóng tất cả các tài nguyên bộ nhớ đã sử dụng.

Tôi đã tạo một dự án trống. Chỉ cần thêm UIWebView. Bộ nhớ được sử dụng trước khi tải yêu cầu (http://methodhome.com/cleanhappy) là 4,5MB và sau khi tải xong - 70 ~ 90 MB.

Sau khi phát hành UIWebView, bộ nhớ đã sử dụng vẫn là 55MB.

Vì vậy, có vẻ như có khoảng 50MB bộ nhớ bị rò rỉ.

phương pháp tôi đã cố gắng tiếp theo:

[_webView stringByEvaluatingJavaScriptFromString:@"var body=document.getElementsByTagName('body')[0];body.style.backgroundColor=(body.style.backgroundColor=='')?'white':'';"]; 
[_webView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML='';"]; 
[_webView stringByEvaluatingJavaScriptFromString:@"document.open();document.close();"]; 
[_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]]; 
[_webView loadHTMLString:@"" baseURL:nil]; 
[_webView stopLoading]; 
_webView.delegate = nil; 
[_webView removeFromSuperview]; 
_webView = nil; 

[[NSURLCache sharedURLCache] removeAllCachedResponses]; 

Tôi cũng đã cố gắng thiết lập:

[[NSUserDefaults standardUserDefaults] setInteger:0 forKey:@"WebKitCacheModelPreferenceKey"]; 

và đã chơi với các thiết lập bộ nhớ cache của bộ nhớ và đĩa. Không có gì hữu ích.

Làm cách nào để có thể thực hiện được? Các trình duyệt phổ biến hoạt động như Safari và Chrome như thế nào với các rò rỉ như vậy. Bí quyết để giải phóng những tài nguyên đó là gì?

+0

Tôi gặp khó khăn với điều này, một bài viết tuyệt vời về điều này, nó đã giúp tôi: http://www.codercowboy.com/code-uiwebview-memory-leak-prevention/ – oren

+1

@oren Bạn không nhận thấy, rằng tôi đã sử dụng tất cả các "thủ thuật" từ bài viết này? – Nikita

+0

Vâng xin lỗi, chỉ cần nhận thấy nó sau khi tôi nhận xét. Vì lý do nào đó, tôi nghĩ rằng có nhiều bài viết hơn. – oren

Trả lời

1

Làm cách nào để có thể?

UIWebView là một API cũ, dựa trên WebKitLegacy. Nó không được chấp nhận vì 1 lý do duy nhất - Apple không có thay thế (cho đến iOS 9).

Trình duyệt phổ biến hoạt động như Safari và Chrome với các lỗ rò như thế nào.

Safari là trình duyệt, được tạo bởi chính Apple. Nó có thể sử dụng bất kỳ hack và API riêng, bị hạn chế trong AppStore. Trên thực tế, hiện tại hành vi của Safari rất gần với WKWebView. Nhưng nó không bao giờ giống với UIWebView.

Chỉ gần đây, Google Chrome mới có thể di chuyển sang WKWebView. Xem https://bugs.chromium.org/p/chromium/issues/detail?id=423444 để biết chi tiết. Trước đó, Google Chrome đang đối mặt với cùng một vấn đề.

Bí quyết để giải phóng những tài nguyên đó là gì?

Tôi đã thử rất nhiều thủ thuật nhưng không ai trong số họ làm việc cho tôi. Thật không may, giải pháp duy nhất là di chuyển sang WKWebView, được giới thiệu trong iOS 8. Hơn nữa, WKWebView có rất nhiều lỗi trong iOS 8, vì vậy trong hầu hết các trường hợp, nó chỉ có thể sử dụng được từ iOS 9.