UIWebView不会释放内存

时间:2015-11-08 19:31:38

标签: ios objective-c xcode uiwebview automatic-ref-counting

我在尝试恢复我在应用程序中为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之前:

Before opening the UIWebView

UIWebView打开后: enter image description here

弹出ViewController并删除对UIWebView的引用: enter image description here

据我所知,这里使用的内存量无限期地持续存在。五分钟后,它仍将分配34+ Mb。如果我再次打开ViewController,它将分配更多,我最终会得到大约40 Mb的基数&#34;使用一旦我再次弹出。

泄漏: 没有被完全劝阻,我最初去寻找泄漏,认为我在某处犯了一些错误。然而,虽然我确实发现了一些非常泄漏,但它们似乎与UIWebView完全相关。

enter image description here

S.O的其他案例 我已经花了很长时间在网上寻找解决方案,但我发现的唯一真正相关的主题是去年的一个,如下所示:UIWebView taking lots of memory

它还没有答案,这可能是因为(与此主题相关的大多数其他问题),许多回复提供了通用/冲突的建议。比如建议你使用ARC(谁没有?),或告知OP他们不应该保留强引用(即使它们不是,并且代码证明了这一点)。最后,一些答案只是声称内存管理不是一个问题,因为它有足够的可用性,而且那些也没有用。

无论如何,这是我面临的当前问题。感谢您花时间阅读本文(如果您这样做了!)。

1 个答案:

答案 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。