我在尝试恢复我在应用程序中为UIWebView
分配的内存时遇到了一些麻烦。我基本上在单独的UIWebView
中为用户临时创建并呈现ViewController
,然后删除所有引用并从堆栈中弹出ViewController
。尽管做了所有这些,但是分配的内存永远不会被返回,而且每次我再次使用ViewController
时,我会再遇到额外的10 Mb内存。
让我们看看我是如何管理这个UIWebView
的。
嗯,首先,我的头文件中有一个本地引用,显示在这里
#pragma mark UIWebView Properties
/// WebView for loading URL resources
@property (nonatomic, weak)UIWebView *webView;
请注意,它不是IBOutlet
,我在以下方法中以编程方式创建此UIWebView
,在ViewDidAppear
中触发。
-(void)presentYoutubeVideoWithID:(NSString *)videoID {
/* Setup UIWebView */
UIWebView *webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
/* Set Delegate */
[webView setDelegate:self];
/* Set local property */
[self setWebView:webView];
/* Add view to ViewController */
[self.view addSubview:webView];
/* Set constraints */
// Removed for simplicity
/* Set URL */
NSString *youTubeVideoHTML = @"<!DOCTYPE html> (Removed) </html>";
NSString *html = [NSString stringWithFormat:youTubeVideoHTML, self.view.frame.size.width, self.view.frame.size.height, videoID];
[webView loadHTMLString:html baseURL:[[NSBundle mainBundle]resourceURL]];
/* Setup Notification */
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleWhenDoneButtonClick:)
name:UIWindowDidBecomeHiddenNotification
object:nil];
}
最后,我清理了一下&#34; pop&#34; UIViewController
:
-(void)handleWhenDoneButtonClick:(NSNotification *)notification {
/* Remove Observer */
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIWindowDidBecomeHiddenNotification object:self.view.window];
/* Remove UIWebView from hierarchy */
[self.webView removeFromSuperview];
/* Remove self from webView delegate */
[self.webView setDelegate:nil];
/* Remove reference because I can */
[self setWebView:nil];
/* Dismiss ViewController */
[self dismissViewControllerAnimated:YES completion:nil];
}
对于一个简单的场景,似乎没有任何东西真正删除UIWebView占用的内存。正如您在此处所看到的,内存使用率从未降低:
在加载UIWebView之前:
弹出ViewController并删除对UIWebView的引用:
据我所知,这里使用的内存量无限期地持续存在。五分钟后,它仍将分配34+ Mb。如果我再次打开ViewController
,它将分配更多,我最终会得到大约40 Mb的基数&#34;使用一旦我再次弹出。
泄漏:
没有被完全劝阻,我最初去寻找泄漏,认为我在某处犯了一些错误。然而,虽然我确实发现了一些非常小泄漏,但它们似乎与UIWebView
完全相关。
S.O的其他案例 我已经花了很长时间在网上寻找解决方案,但我发现的唯一真正相关的主题是去年的一个,如下所示:UIWebView taking lots of memory
它还没有答案,这可能是因为(与此主题相关的大多数其他问题),许多回复提供了通用/冲突的建议。比如建议你使用ARC(谁没有?),或告知OP他们不应该保留强引用(即使它们不是,并且代码证明了这一点)。最后,一些答案只是声称内存管理不是一个问题,因为它有足够的可用性,而且那些也没有用。
无论如何,这是我面临的当前问题。感谢您花时间阅读本文(如果您这样做了!)。
答案 0 :(得分:1)
我遇到了同样的问题。在iOS 9设备中使用UIViewController
(加载google.com)推送UIWebView
时,内存大小从26 MB增加到36 MB,并在弹出控制器后保持不变。
我使用WKWebView
(iOS 8+)代替UIWebView
进行了相同的测试。这次,内存大小从26 MB到27.5 MB,在弹出控制器后,它回落到~26 MB。
问题似乎部分是由于UIWebView
的实施方式。也许您可以使用https://github.com/floatlearning/FLWebView,这是一个WKWebView
,其中UIWebView
支持iOS。