Нужно удалять просмотры? Чтобы очистить контроллер Alloy (память/производительность)

Допустим, у меня есть ScrollableView с 3 представлениями (формами), эти представления имеют как минимум 10 полей, взгляните на этот пример.

index.js

$.content.add(Alloy.createController('scrollable').getView());

прокручиваемый.js

$.scrollableView.addView(Alloy.createController('form',{
    fields:[
        {label:'field 1',type:'text'},
        {label:'field 1',type:'date',value:'2016-06-08'},
        ...
    ]
}).getView());

$.scrollableView.cleanup = function() {

    $.destroy();

    $.off();

    for(var i = parseInt($.scrollableView.views.length); i > 0; i--) if($.scrollableView.views[i-1]) {

        if($.scrollableView.views[i-1].cleanup) $.scrollableView.views[i-1].cleanup();
        $.scrollableView.views[i-1] = null;
        $.scrollableView.removeView($.scrollableView.views[i-1]);
    }   

    $ = args = null;
};

form.js

for(var i in args.fields) $.form.add(Alloy.createController('field',args.fields[i]).getView());

$.form.cleanup = function() {

    $.destroy();

    $.off();

    for(var i in $.form.children) {

        if($.form.children[i].cleanup) $.form.children[i].cleanup();
        $.form.children[i] = null;
    }

    $.form.removeAllChildren();

    $ = args = null;
};

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

Когда я хочу удалить ScrollableView, я запускаю функцию очистки для каждого представления и его дочерних элементов.

  • Должен ли я запускать функцию очистки для всех представлений ScrollableView?

  • Должен ли я обнулить все представления ScrollableView?

  • Должен ли я удалить все представления ScrollableView?

  • Должен ли я запускать функцию очистки для всех дочерних элементов View?

  • Должен ли я обнулить все дочерние элементы View?

  • Должен ли я удалить все дочерние элементы View?

ОБНОВЛЕНИЕ

В этом случае мне все равно нужно очистить все поля? или установка данных на нуль решит это?

form.js

var args = arguments[0],
    data = {
        fields:{}
    };

for(var i in args.fields) {

    data.fields[args.fields[i].label] = Alloy.createController('field',args.fields[i]).getView();

    $.form.add(data.fields[args.fields[i].label]);
}

$.form.cleanup = function() {

    $.destroy();

    $.off();

    //this is needed?
    for(var i in data.fields) {

        if(data.fields[i].cleanup) data.fields[i].cleanup();
        data.fields[i] = null;
    }
    //this is needed?

    $ = data = args = null;
};

В любом случае, если в мои поля добавлен прослушиватель событий, например «изменение» или «щелчок», я должен удалить его в функции очистки, верно?


person Ricardo Pereira    schedule 08.06.2016    source источник
comment
Если вы null данные, все ссылки на различные представления также будут потеряны. Так что это исправит   -  person Rene Pot    schedule 08.06.2016


Ответы (1)


Нет необходимости удалять все представления, единственное, что вам нужно сделать для очистки памяти, это удалить самое родительское представление и все ссылки на что-либо в самом родительском представлении и ссылку на родительское представление.

Итак, в вашем случае вам нужно только удалить ScrollableView, а в прокручиваемом представлении вам нужно сделать $.off(). $.destroy() нужен только в том случае, если вы используете привязку данных (модели/коллекции).

Поскольку ваши дочерние представления никогда не имеют ссылки (переменной), нет необходимости их удалять. Он автоматически обрабатывается Appcelerator/JavaScript и будет очищен сборщиком мусора, когда придет время.

примечание. Сборка мусора не происходит сразу после удаления представлений, поэтому у вас может увеличиться использование памяти. И JavaScript, и нативная платформа имеют собственную сборку мусора.

Вы можете прочитать больше об управлении памятью в этой статье о TiDev, которая еще очень актуально.

В обновленном вопросе вы установили все подпредставления в объекте data. nulling объект данных также удалит все ссылки на представления, так что этого должно быть достаточно.

person Rene Pot    schedule 08.06.2016
comment
Спасибо, я не использую модели или коллекции, так что $.destroy и $.off не нужны? Я думал, что это всегда необходимо, tidev.io/2014 /09/18/очистка-контроллеров-сплавов - person Ricardo Pereira; 08.06.2016
comment
Еще одна вещь: если я ссылаюсь на форму и ее поля, мне нужно установить их как нулевые в моей функции очистки, верно? - person Ricardo Pereira; 08.06.2016
comment
Вам нужно использовать только $.off Только $.destroy() для привязки данных. И если у вас есть ссылки на все дочерние элементы формы, вам нужно null их всех. - person Rene Pot; 08.06.2016
comment
Допустим, в моем представлении формы у меня есть переменная с именем data = {}; и когда я создаю форму, я добавляю все поля в data.fields = {}; в моей функции очистки формы мне не нужно зацикливать data.fields, я могу установить только данные равными нулю? - person Ricardo Pereira; 08.06.2016
comment
Я использую запросы SQLite и передаю их представлениям в качестве аргументов, для этого мне все равно не нужно отключать и уничтожать? - person Ricardo Pereira; 08.06.2016
comment
вам ВСЕГДА нужно $.off(). Вам нужно ТОЛЬКО $.destroy(), когда вы используете привязку данных. SQLite не считается привязкой данных. Это привязка данных: medium.com/all-titanium/ - person Rene Pot; 08.06.2016
comment
Я проводил некоторые тесты, если я просто удалю и обнулю родительское представление, мое дочернее представление будет иметь 2 переменные (данные и аргументы), эти переменные останутся? В одном из моих дочерних представлений у меня есть диалоговое окно предупреждения, которое показывает свойство объекта данных, время ожидания составляет 60 секунд, я удалил и обнулил родительское представление, но все же, через несколько секунд, когда появляются предупреждения, значение data.test все еще существует, но если я запускаю метод очистки во всех дочерних элементах, предупреждение не может найти переменную - person Ricardo Pereira; 28.07.2016
comment
Потому что у вас там таймаут, весь контроллер не может быть очищен, потому что он вам все равно нужен. Даже если убирать самому, сам контроллер все равно существует. Если вы отбросите все ссылки на это представление, и представление больше не будет делать ничего, оно может быть очищено сборщиком мусора. Когда именно это произойдет, зависит от ОС. - person Rene Pot; 29.07.2016