Nano Hash - криптовалюты, майнинг, программирование

Утечки памяти Appcelerator — платформа Alloy

Я использую инфраструктуру Alloy в Appcelerator и борюсь с утечками памяти при тестировании своего приложения с помощью Apple Instruments.

У меня есть прокручиваемый вид, представления, которые являются представлениями или «страницами» этого прокручиваемого представления, и представления, такие как миниатюры, которые являются дочерними элементами представлений «страницы». Все эти представления создаются динамически, а затем удаляются и создаются заново, когда пользователь выполняет поиск, который перезагружает содержимое прокручиваемого представления.

Моя проблема заключается в том, что, хотя я удаляю прокручиваемое представление и устанавливаю для него значение null, живые байты в инструментах продолжают расти каждый раз, когда выполняется поиск и создается новое прокручиваемое представление. Как я должен обрабатывать эти элементы пользовательского интерфейса, чтобы их можно было удалить при сборке мусора?

var videoSlider;

function loadData(searchTerms,channel,sortBy,limit) {
if (videoSlider) {
    $.scrollableViewHolder.remove(videoSlider);
    videoSlider = null;
}

videoSlider = Alloy.createController('videoSlider', {}).getView();
$.scrollableViewHolder.add(videoSlider);

var viewSliderArray = [];

feeds.GetFeeds({
    success: function(data) {
        Ti.API.info("Number of videos returned from Brightcove " + videosObject.items.length);
        var j = 0;
        for(var i=0; i<videosObject.items.length; i++) {
            if(i % 8 == 0) {
                Ti.API.info(i);
                if(i > 0) {
                    viewSliderArray.push(viewSlider);
                }
                viewSlider = Alloy.createController('viewSlider', {}).getView();
                j = 0;
            }

            tempTime = videosObject.items[i].length/1000;
            minutes = Math.round(tempTime/60);
            seconds = Math.round(tempTime%60);
            seconds = "0"+seconds;
            seconds = seconds.substr(seconds.length-2);

            videoLength = minutes+":"+seconds;

            videoBox = Alloy.createController('videoBox', {
                videoBoxTop: videoBoxTop[j],
                videoBoxLeft: videoBoxLeft[j],
                videoStill : videosObject.items[i].videoStillURL,
                videoTitle: videosObject.items[i].name,
                videoLength: videoLength
            }).getView();

            viewSlider.add(videoBox);
            j++;
        }
        viewSliderArray.push(viewSlider);

        Ti.API.info(viewSliderArray);

        videoSlider.views = viewSliderArray;
    }
},searchTerms,channel,sortBy,limit);

}

  • Вы решили это? 14.02.2014

Ответы:


1

Удалите все дочерние элементы из прокрутки и установите для них значение null. Вот пример кода, который может быть вам полезен:

exports.removeChildren = function(thisView){
if (thisView.children) 
{
    var removeData = [];
    for (var i = thisView.children.length; i > 0; i--)
    {
       removeData.push(thisView.children[i-1]);  
    };
    // Remove childrens
    for (var i = 0; i < removeData.length; i++)
    {
       thisView.remove(removeData[i]);
    }
    removeData = null;
}
}
07.05.2015

2

Попробуйте это для очистки памяти вашего представления.

 clean(Your_View);
 Your_View = null;

function do_clean(e, c) {
    try{
        clean(c);
    e.remove(c);
    c = null;
    }catch(ex){
        Ti.API.info('Exception in removing child: '+ex +'children :'+c);
    }
    return;
}

function clean(e) {
    if (e != null) {
        if (e.children) {
            for (var i = 0; i < e.children.length; i++) {
                if(e.children[0] != undefined && e.children[0] != null)
                    do_clean(e, e.children[0]);
            }
        } else {
            return;
        }
    }
}

Также попробуйте удалить все прослушиватели событий, которые не нужны.

07.05.2015

3

Вам нужно вызвать removeAllChildren для прокрутки, а также установить для viewSliderArray пустой массив, то есть viewSliderArray = [], иначе ссылки будут поддерживаться.

Кроме того, при использовании инструментов вы можете искать TiUI и видеть, какое представление конкретно увеличивается, таким образом вы можете определить конкретные представления, которые доставляют вам проблемы.

11.05.2015
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..