加载/卸载HTML5 <video>时,iOS Safari内存泄漏

Sim*_*eon 17 safari html5 ipad html5-video ios

我开发了一个带有几个UIWebView的iPad应用程序,它采用以下HTML和JavaScript.由于iPad一次只能播放一个视频,因此在特定的Web视图聚焦之前,我不会加载视频.

这是通过在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>
Run Code Online (Sandbox Code Playgroud)

Sim*_*eon 32

我终于解决了这个!解决方案是清空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>
Run Code Online (Sandbox Code Playgroud)

  • 我有完全相同的问题,内存泄漏很糟糕,chrome不喜欢放弃资源.浏览器真的不喜欢被视为无状态应用程序.感谢您的发现并回答您自己的问题.+1 (3认同)