2015-02-09 28 views
6

Dự án của tôi là một lib tĩnh lai để hiển thị UIWebView với một số JS để kiểm soát logic. Khi tôi sử dụng 64bit và chạy demo trên iOS 8/iPhone 6, bộ nhớ sẽ tiếp tục 30M trở lên!Rò rỉ bộ nhớ với UIWebView

  1. Khi tôi sử dụng thế hệ trong công cụ, mức sử dụng bộ nhớ tăng gần như là tất cả từ webcore; nó có nghĩa là có rò rỉ trong mã JS? Tôi không thể tìm thấy một rò rỉ khi tôi sử dụng Safari để chạy JS tương tự trực tiếp.

  2. Khi tôi phát hành UIWebView, bộ nhớ vẫn chưa được giải phóng; Tôi đã thử nghiệm với phân bổ công cụ. Có một số webcore và (không đối tượng) vẫn còn trong bộ nhớ, những gì tôi có thể làm gì để phát hành chúng?

    • 0JavaScriptCore WTF :: MallocHook :: recordAllocation (void *, unsigned long)
    • 1 JavaScriptCore WTF :: fastMalloc (unsigned long)
    • 2 WebCore WebCore :: SharedBuffer :: đệm() const
    • 3 WebCore WebCore :: SharedBuffer :: dữ liệu() const
    • 4 WebCore WebCore :: ResourceLoader :: didReceiveDataOrBuffer (const char *, unsigned int, WTF :: PassRefPtr, lâu dài, WebCore :: DataPayloadType)
    • 5 WebThêm WebCore :: SubresourceLoader :: di dReceiveDataOrBuffer (const char *, int, WTF :: PassRefPtr, lâu dài, WebCore :: DataPayloadType)
    • 6 WebCore WebCore :: SubresourceLoader :: didReceiveBuffer (WTF :: PassRefPtr, lâu dài, WebCore :: DataPayloadType)
    • 7 WebCore WebCore :: ResourceLoader :: didReceiveBuffer (WebCore :: ResourceHandle *, WTF :: PassRefPtr, int)
    • 8 WebCore WebCore :: SynchronousResourceHandleCFURLConnectionDelegate :: didReceiveDataArray (__ CFArray const *)

tôi sử dụng mã sau đây.

-(void)createUIWebview{ 
[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:serviceUrl]]]; 
} 

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
[[NSUserDefaults standardUserDefaults] setInteger:0 forKey:@"WebKitCacheModelPreferenceKey"]; 
} 

-(void)dealloc{ 
if (_webView.isLoading){ 
    [_webView stopLoading]; 
} 
[_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]]; 
_webView.delegate=nil; 
[_webView removeFromSuperview]; 
[_webView release]; 
_webView = nil; 
} 

Tôi đã nghiên cứu các liên kết sau, nhưng dường như chúng không giải quyết được sự cố của tôi. UIWebview có bị rò rỉ trong iOS 8 không? Và vấn đề dường như không rõ ràng khi tôi sử dụng iOS 6 trong iPhone4.

Whats the proper way to release a UIWebView?

iOS 8 UIWebView memory management

UIWebView leaks, JS Garbage Collector & WebCore VMs

Release memory/cookie/cache from UIWebView once closed

Trả lời

6

Tôi đã có cùng một vấn đề và chuyển sang mới WKWebView và nó ngay lập tức giải quyết tất cả các vấn đề rò rỉ bộ nhớ tôi đã nhìn thấy. WKWebView chia sẻ nhiều tên gọi giống nhau từ UIWebView vì vậy tất cả những gì tôi phải thực hiện trên dự án của mình là chuyển tất cả các đối tượng `UIWebView 'sang' WKWebView 'và rò rỉ bộ nhớ biến mất.

Hãy nhớ nhập WebKit vào dự án của bạn và biết rằng chỉ có sẵn trên iOS8.

Apple Documentation

+0

'WKWebView' không kế thừa từ' UIWebView', đây là lớp hoàn toàn mới và khác biệt. Nếu bạn đang sử dụng iOS 8, bạn chắc chắn nên sử dụng nó trên 'UIWebView'. Bạn cũng nên sử dụng ARC. –

+0

@jshier - Cảm ơn bạn đã nắm bắt ... Tôi đã chỉnh sửa câu trả lời từ những gì tôi muốn nói (Đó là họ chia sẻ nhiều tên gọi cùng một phương thức làm cho nó trở thành một công tắc rất dễ dàng). –

+0

cảm ơn bạn rất nhiều vì giải pháp của bạn, WKWebView hoạt động cho trường hợp của tôi! –

0

Tôi đã có một vấn đề tương tự, có người dùng thử nghiệm các ứng dụng bằng cách xem trước hình ảnh trong UIWebView. Ứng dụng sẽ gặp sự cố sau khi xem trước N. Sử dụng công cụ Apple Instruments với mẫu định cấu hình Allocations. Từ công cụ, tôi đã có thể chọn Thời hạn phân bổ sau: "Đã tạo & liên tục". Quan sát thêm là khi xem trước cùng một tệp nhiều lần, Persistent Bytes (Dựa trên định nghĩa của apple, đây là số byte đã được cấp phát, nhưng không được phát hành.) Cho ImageIO_jpeg_Data tiếp tục tăng gấp đôi, điều này đúng với bất kỳ loại hình ảnh nào khác .

Độ phân giải cho việc này là sử dụng UIImageView từ apple làm trình xem trước riêng cho Hình ảnh, điều này không làm rò rỉ bộ nhớ khi xem trước hình ảnh.