1

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

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

Alloy.createController(screenToLaunch, payloadJson);

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

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

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

更新HPROF 差异

以上是控制器开启和关闭的HPROF区别。我没有使用任何数据库调用,但我看到有许多与数据库相关的调用正在进行。我认为可能是该框架正在使用这些调用来实现其内部功能。

4

2 回答 2

0

我将这种架构用于控制器(UI.Windows)并且效果很好。

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

清理合金控制器

于 2016-05-05T20:51:43.137 回答
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;
};

按钮.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;
};

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

更新

添加删除运算符和尝试语句

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;
    }
};
于 2016-05-06T08:16:49.893 回答