2010-08-27 38 views
10

Tôi gặp sự cố khi sử dụng UIWebViews, tôi đã thấy cùng một câu hỏi ở đây nhưng không có câu trả lời hữu ích. câu hỏi là ở đây: UIWebView memory management. Tôi sẽ báo giá:uiwebview và mất bộ nhớ rất lớn

Tôi đang phát triển một ứng dụng sử dụng nhiều UIWebView. Ứng dụng này tạo ra rất nhiều UIWebViews trong khi tải nội dung từ máy chủ của tôi. Một số UIWebView này khá lớn và có rất nhiều hình ảnh.

Nếu tôi sử dụng các công cụ để phát hiện rò rỉ, tôi không phát hiện bất kỳ lỗi nào. Tuy nhiên, rất nhiều đối tượng được phân bổ và tôi nghi ngờ rằng phải làm với UIWebViews.

Khi các bản xem trước web được phát hành vì không còn cần thiết, có vẻ như không phải tất cả bộ nhớ đều được giải phóng. Ý tôi là, sau khi một yêu cầu đến máy chủ của tôi, ứng dụng tạo ra một UITableView và nhiều trang web (các công cụ nói khoảng 8Mb). Khi người dùng chạm vào, tất cả chúng đều được phát hành nhưng việc sử dụng bộ nhớ chỉ giảm khoảng 2-3 Mb và sau 5-10 phút sử dụng ứng dụng mà nó bị lỗi.

Tôi đã tạo ứng dụng thử nghiệm đơn giản và có cùng kết quả.

Đó là một tableView, tôi là tạo DetailsView như thế này:

DetailsVC *detailViewController = [[DetailsVC alloc] initWithNibName:@"DetailsVC" bundle:nil]; 
detailViewController.n = indexPath.row; 
[self.navigationController pushViewController:detailViewController animated:YES]; 
[detailViewController release]; 

trong DetailsVC Tôi có một WebView tạo ra trong IB. Tôi tải html như thế này:

NSString *urlAddress; 
if (self.n == 0) 
{ 
    urlAddress = @"http://www.google.com"; 
} 
else 
{ 
    urlAddress = @"http://www.yahoo.com"; 
} 

NSURL *url = [NSURL URLWithString:urlAddress]; 

NSURLRequest *requestObj = [NSURLRequest requestWithURL:url]; 

[self.webView loadRequest:requestObj]; 

Tôi cũng làm:

- (void)viewDidUnload { 
self.webView = nil; 
} 

Vậy là xong, mỗi khi tôi chọn bất kỳ WebView trong RootViewController tôi mất 2-3 Mb bộ nhớ, Có một giải pháp cho vấn đề này?

Cảm ơn.

+0

nó có vẻ như vấn đề rất cũ và nổi tiếng, mọi người đang chạy vào nó kể từ năm 2008 và vẫn không có giải pháp ((((http://discussions.info.apple.com/thread.jspa?threadID=1729697 – Burjua

+0

Ok, Tôi tìm thấy một ý tưởng làm thế nào để làm việc xung quanh vấn đề này, nó được mô tả ở đây: http: //www.iphonedevsdk.com/forum/iphone-sdk-development/34840-uiwebview-memory-crash-caching-memory-useage.html. Tôi không thể tin rằng đó là cách duy nhất để làm điều đó, bất kỳ suy nghĩ khác? Cảm ơn – Burjua

+0

có thể trùng lặp của [Có bộ nhớ rò rỉ UIWebView?] (http: // stackoverflow.com/questions/648396/does-uiwebview-leak-memory) –

Trả lời

0

Tôi đoán rằng vì bạn đặt chế độ xem web = nil, bạn sẽ mất mọi cơ hội phát hành nó.

+0

Tôi đã thử với nó và không có nó, nó thực sự không quan trọng, nó đang được phát hành, nhưng không chỉ một phần của bộ nhớ được giải phóng – Burjua

+1

Thiết lập một tài sản giữ lại để nil cũng phát hành giá trị trước đó. –

3

Chỉ cần kiểm tra như sau 1. Là u làm cho webview là tài sản loại bỏ nó 2. Và đặt đoạn mã sau vào didFinishLaunchingWithOptions trong Appdelegate

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil]; 
    [NSURLCache setSharedURLCache:sharedCache]; 
    [sharedCache release]; 

Tôi nghĩ rằng sau đó ur vấn đề được giải quyết

+0

Ok, cảm ơn, tôi sẽ thử nó – Burjua

+1

Không, thật không may điều này không giúp được: (( – Burjua

0

Tôi biết thread này là một chút cũ nhưng chỉ cho một ý tưởng và thêm vài bit có liên quan hơn tôi muốn thêm những lời khuyên để khách truy cập trong tương lai có thể có một cái nhìn lúc này là tốt và có vấn đề có thể được giải quyết.

  • Bạn nên set Cache policy để đối tượng NSURLRequest và kiểm tra các chính sách bỏ qua dữ liệu bộ nhớ cache, xem documentation.

  • Vì bạn có cuộc gọi đến release trong mã của mình, tôi cho rằng bạn đang sử dụng ARC, vậy tại sao bạn không gọi [super dealloc] trong chế độ xemDidUnload()?

  • Hãy xem chủ đề này để biết cách cleanForDealloc sử dụng UIWebView.

  • Đây có phải là UITableViewController không? với một ô tùy chỉnh? Hãy thử deallocating (release, removeFromSuperView, thiết lập để nil) chúng là tốt.

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

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