2016-06-08 2 views
1

Допустим, что у меня есть прокручиваемый вид с 3 видами (формами), эти формы имеют не менее 10 полей, посмотрите на этот пример.Необходимо удалить просмотров? Чтобы очистить контроллер сплава (память/производительность)

index.js

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

scrollable.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, я запускаю функцию очистки на каждом представлении, а это дети.

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

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

  • Следует ли удалить все виды прокрутки?

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

  • Должен ли я игнорировать всех детей?

  • Должен ли я удалить всех детей?

UPDATE

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

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; 
}; 

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

+0

Если вы «запустили» данные, все ссылки на разные виды тоже будут потеряны. Так что это исправит –

ответ

2

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

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

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

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

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

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

+0

Спасибо, я не использую модели или коллекции, так что не нужно $ .destroy и $ .off? Я думал, что это всегда необходимо, http://www.tidev.io/2014/09/18/cleaning-up-alloy-controllers/ –

+0

Просто еще одна вещь. Если я ссылаюсь на форму и ее поля, мне нужно установить их как null в моей функции очистки, правильно? –

+0

Вам нужно использовать '$ .off' Только' $ .destroy() 'для привязки данных. И если у вас есть ссылки на всех детей формы, вам нужно «обнулить» их всех. –