I have a problem with memory management.
I am developing an application that makes heavy use of UIWebView. This app generates dynamically lots of UIWebViews while loading content from my server. Some of these UIWebViews are quite large and have a lot of pictures.
If I use instruments to detect leaks, I do not detect any. However, lots of objects are allocated and I suspect that has to do with the UIWebViews.
When the webviews release because no longer needed, it appears that not all memory is released. I mean, after a request to my server the app creates an UITableView and many webviews (instruments say about 8Mb). When user tap back, all of them are released but memory usage only decrement开发者_如何学Gos about 2-3 Mb, and after 5-10 minutes using the app it crashes.
Am I missing something? Anyone know what could be happening?
Thank you!
This isn't a solution, but a possible explanation of the issues you're facing.
I had memory problems with an app I worked on. It consisted of (in effect) a scroll view, containing 3 full screen sized web views. Each webview's content size was multiple screens, say 10 on average.
When you load a webview, the whole view is rendered in memory. SO, aside from the memory used to load the images and other data (the stuff you see in the Allocations instrument), the web view itself uses memory when it's rendered that you have no control over.
So, for example, a 768x1024 webview, with 10 pages of content would use
768 * 1024 * 10 (pages) * 4 (bits per pixel) = 31,457,280 = 30MB.
Multiply by 3 web views, and that's 90MB used on top of memory that the app allocated directly.
You can get a feel for how much memory is being used like this in Instruments, using the VM Tracker instrument.
Try adding
[webView loadHTMLString: @"" baseURL: nil];
right before you release the webview. For a leak in 4.2.1 relating to displaying a PDF in a UIWebView this solves most of the leak problems for me.
Write this in your viewWillDisappear
method:
[WebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]];
If you add multiple subviews within the same instance of a viewcontroller, you must remove the old subview from the superview before you add a new subview.
Add a tag to the UIWebView before you add it as a subview:
webView.tag = 10;
[self.view addSubview:webView];
webView = nil;
Before you add the new webview(this will clear the old view), remove the subview from the superview:
UIWebView * oldWebView = (UIWebView *)[self.view viewWithTag:10];
[oldWebView removeFromSuperview];
If you don´t remove the old webviews from the superview, they will build up in memory until you release the viewcontroller.
精彩评论