IOS Ошибка памяти Safari при загрузке/выгрузке HTML5 <video>
Я разработал 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
Я, наконец, решил это! Решение заключалось в том, чтобы удалить 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>