有必要删除视图吗?为了清理 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 时,我 运行 每个视图及其子视图的清理函数。
我是否应该 运行 所有 ScrollableView 视图的清理功能?
我应该清空所有 ScrollableView 视图吗?
我应该删除所有 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
处理数据对象也会删除所有对视图的引用,这样就足够了。
假设我有一个带有 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 时,我 运行 每个视图及其子视图的清理函数。
我是否应该 运行 所有 ScrollableView 视图的清理功能?
我应该清空所有 ScrollableView 视图吗?
我应该删除所有 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
处理数据对象也会删除所有对视图的引用,这样就足够了。