最近我一直在对我的一个应用程序进行一些内存分析。该应用程序是为Android平台。对于其中两个屏幕,我观察到有泄漏。
没有验证,我删除了所有代码并且只在两个控制器上保持$ .screenName.open()调用,并且它们调用它们的方式是:
Alloy.createController(screenToLaunch, payloadJson);
在各个控制器内部,存在open()调用。我使用DDMS进行堆分析。
在打开控制器A之前,我按下原因GC几次以获得稳定的分配读数。完成后,我启动控制器A并按后退按钮关闭它。现在,当我多次点击原因GC时,每次都会有60KB的差异。
我没有在任何全局变量中存储createController引用。知道它为什么会以这种方式表现吗?
以上是控制器打开和关闭之间的HPROF差异。我没有使用任何数据库调用,但我发现有很多与数据库相关的调用。我认为可能是框架正在使用这些调用来实现其内部功能。
答案 0 :(得分:0)
我使用这个architecture作为控制器(UI.Windows)并且运行良好。
答案 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;
}
};