有必要删除视图吗?为了清理 Alloy 控制器 (memory/performance)

It's necessary to remove views? In order to cleanup the Alloy controller (memory/performance)

假设我有一个带有 3 个视图(表单)的 ScrollableView,这些表单视图至少有 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 时,我 运行 每个视图及其子视图的清理函数。

更新

在这种情况下,我还需要清理所有字段吗?或者将数据设置为 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;
};

无论如何,如果我的字段添加了事件侦听器,如 'change' 或 'click',我必须在清理功能中将其删除,对吗?

不需要删除所有视图,清理内存唯一需要做的就是删除最父视图,以及对最父视图中任何内容的所有引用以及对父视图的引用。

所以在你的情况下,你只需要删除 ScrollableView 并且在 scrollableView 中你需要做 $.off()$.destroy() 仅在使用数据绑定 (models/collections) 时才需要。

因为您的子视图从来没有引用(变量),所以没有必要删除它们。它由 Appcelerator/JavaScript 自动处理,到时候将通过垃圾收集进行清理。

注意:垃圾收集不会在您删除视图后立即发生,因此您可能仍会增加内存使用量。 JavaScript 和本机平台都有自己的垃圾收集。

您可以在这个 article on TiDev 中阅读更多关于内存管理的内容,它仍然非常相关。

在您更新的问题中,您在 data 对象中设置了所有子视图。 null处理数据对象也会删除所有对视图的引用,这样就足够了。