Alloy createController不会从内存中释放

时间:2016-05-05 20:20:40

标签: appcelerator appcelerator-titanium appcelerator-alloy

最近我一直在对我的一个应用程序进行一些内存分析。该应用程序是为Android平台。对于其中两个屏幕,我观察到有泄漏。

没有验证,我删除了所有代码并且只在两个控制器上保持$ .screenName.open()调用,并且它们调用它们的方式是:

Alloy.createController(screenToLaunch, payloadJson);

在各个控制器内部,存在open()调用。我使用DDMS进行堆分析。

在打开控制器A之前,我按下原因GC几次以获得稳定的分配读数。完成后,我启动控制器A并按后退按钮关闭它。现在,当我多次点击原因GC时,每次都会有60KB的差异。

我没有在任何全局变量中存储createController引用。知道它为什么会以这种方式表现吗?

更新HPROF Difference

以上是控制器打开和关闭之间的HPROF差异。我没有使用任何数据库调用,但我发现有很多与数据库相关的调用。我认为可能是框架正在使用这些调用来实现其内部功能。

2 个答案:

答案 0 :(得分:0)

我使用这个architecture作为控制器(UI.Windows)并且运行良好。

  • 打开窗口:Alloy.createController(' name_controller')。getView()。open();

Cleaning up Alloy controllers

答案 1 :(得分:0)

这是我对所有控制器和小部件的清理方法:

someview.js

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

data.button = Alloy.createController('button',{
    title:'button'
}).getView();

 $.view.cleanup = function() {

    $.destroy();

    $.off();

    data.button.cleanup();

    $ = data = args = null;
};

button.js

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

data.click = function() { ... };

$.view.addEventListener('click',data.click);

$.view.cleanup  = function() {

    $.destroy();

    $.off();

    $.view.removeEventListener('click',data.click);

    $ = data = args = null;
};

我创建了一个全局函数,调用清理方法并删除控制器的每个子节点上的内容:

<强>更新

添加了删除操作符和try语句

exports.unset = function(view) {

    if(view) {

        if(view.children && view.children.length) {

            for(var i in view.children) try { util.unset(view.children[i]);
            } catch(e) {}

            view.removeAllChildren();
        }

        if(view.views && view.views.length) for(var i = view.views.length; i > 0; i--) if(view.views[i-1]) {

            if(view.removeView) view.removeView(i-1);

            try { util.unset(view.views[i-1]);
            } catch(e) {}
        }

        if(view.cleanup) try { view.cleanup();
        } catch(e) {}

        view = null;

        delete view;
    }
};