Утечка памяти в iOS Safari при загрузке / выгрузке HTML5 <video> - PullRequest
16 голосов
/ 02 марта 2011

Я разработал приложение для iPad с несколькими UIWebViews, которое использует следующие HTML и JavaScript.Поскольку iPad может воспроизводить только одно видео за раз, я не загружаю видео до тех пор, пока не будет сфокусировано конкретное веб-представление.

Это делается путем вызова метода stringByEvaluatingJavaScriptFromString в UIWebView, отправив вызов методу JS getFocus () .Точно так же, когда веб-представление больше не требуется, я вызываю 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>

1 Ответ

32 голосов
/ 09 марта 2011

Я наконец-то решил это!Решением было очистить 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>
...