【问题标题】:iOS Safari memory leak when loading/unloading HTML5 <video>加载/卸载 HTML5 <video> 时 iOS Safari 内存泄漏
【发布时间】:2011-07-07 10:10:38
【问题描述】:

我开发了一个带有多个 UIWebViews 的 iPad 应用程序,它采用以下 HTML 和 JavaScript。由于 iPad 一次只能播放一个视频,因此我不会加载视频,直到聚焦特定的网络视图。

这是通过调用 UIWebView 上的 stringByEvaluatingJavaScriptFromString 方法,发送对 JS 方法 getFocus() 的调用来完成的。同样,当不再需要 web 视图时,我调用 lostFocus() 来卸载视频。这使得另一个 UIWebView 可以播放另一个视频。

到目前为止,一切都很好。一切都很完美。除了一件事:这会导致内存泄漏。无论何时查看

我尝试重新加载 UIWebView(而不是使用 JS 卸载视频),但没有成功。我还尝试了无数种不同的 JavaScript 变体、标签变体等等。

<div id="videoDiv"></div>

<script type="text/javascript">
    var movieDiv = document.getElementById('videoDiv'),
        movieHtml = '<video id="video" src="../Documents/<%= VideoFileName %>" width="768" height="911"></video>';

    var gotFocus = function () {
        movieDiv.innerHTML = movieHtml;
        var movie = document.getElementById('video');
        movie.play();
        movie.addEventListener('pause', function () {
            movie.currentTime = 0;
            movie.play();
        }, false);
    };
    var lostFocus = function () {
        movieDiv.innerHTML = '';
    };
</script>

【问题讨论】:

    标签: ipad ios html safari html5-video


    【解决方案1】:

    我终于解决了这个问题!解决方案是清空 src 并“加载”一个不存在的视频。这不会导致内存泄漏。看看:

    <div id="videoDiv"></div>
    
    <script type="text/javascript">
        var movieDiv = document.getElementById('videoDiv'),
            movieHtml = '<video id="video" src="" width="768" height="911"></video>';
    
        movieDiv.innerHTML = movieHtml;
        var movie = document.getElementById('video');
    
        var gotFocus = function () {
            movie.src = '../Documents/<%= VideoFileName %>';
            movie.load();
            movie.play();
            movie.addEventListener('pause', function () {
                movie.currentTime = 0;
                movie.play();
            }, false);
        };
        var lostFocus = function () {
            movie.src = '';
            movie.load(); // This line may be removed, see comments
        };
    </script>
    

    【讨论】:

    • 我遇到了完全相同的问题,内存泄漏很糟糕,chrome 不喜欢放弃资源。浏览器真的不喜欢被视为无状态应用程序。感谢您的发现并回答您自己的问题。 +1
    • 简单有效。值得注意的是,在我的测试中,仅设置 src='' 和设置 src 然后调用 .load() 之间没有任何区别。所以你可能可以取消这条线。
    • 这似乎也适用于
    • 我有一个应用程序在 iOS6 中运行良好,但在 iO7 中一段时间​​后停止播放视频。使用这个技巧已经解决了它!
    • 这在桌面 chrome 上似乎也适用于我!对于那些想看到它工作的人:jsfiddle.net/GhS2Z/3 当行被注释掉时,您可以看到任务管理器中的选项卡增加了内存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    相关资源
    最近更新 更多