Continue on iphone with leaks around UIWebView! Here is another big one with no apparent solution. When we try to release a UIWebView component, very few memory is freed. So any application using this object to display webpages is going to crash quickly with Low memory exception :(
I think this memory usage graph gives an idea on how big is this new king of
leak:
- Create a UIWebView
- Load http://www.google.com/
- Release the webview (UIWebView dealloc is correctly called!)
Look how so few memory is freed :/
The leak is all but tiny! Before the loading of the webpage, the application was using 630kB of memory, and after the release of the UIWebview, 1150kB! So we have a 500KB leak in order to simply display the home of Google.com!
This time, I didn’t manage to find any hack to solve this bug.
So if you have any tips to fix this, don’t hesitate to post a comment!
I’ve tried a lot of differents hacks to free more memory (or use less), like:
// Setup the webview to disable some fancy effect on phone number, but doesn't change anything on memory released ... webview.dataDetectorTypes = UIDataDetectorTypeNone; webview.allowsInlineMediaPlayback = NO;
or
// Remove and disable all URL Cache, but doesn't seem to affect the memory [[NSURLCache sharedURLCache] removeAllCachedResponses]; [[NSURLCache sharedURLCache] setDiskCapacity:0]; [[NSURLCache sharedURLCache] setMemoryCapacity:0];
or
// Remove all credential on release, but memory used doesn't move! NSURLCredentialStorage *credentialsStorage = [NSURLCredentialStorage sharedCredentialStorage]; NSDictionary *allCredentials = [credentialsStorage allCredentials]; for (NSURLProtectionSpace *protectionSpace in allCredentials) { NSDictionary *credentials = [credentialsStorage credentialsForProtectionSpace:protectionSpace]; for (NSString *credentialKey in credentials) { [credentialsStorage removeCredential:[credentials objectForKey:credentialKey] forProtectionSpace:protectionSpace]; } }
or
// Cleanup the HTML document by removing all content // This time, this hack free some additional memory on some websites, mainly big ones with a lot of content [webview stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML='';"];
But I never reach complete release of memory used by the web component :(