我想了解删除带有事件侦听器的项目时的最佳实践。
例如:
我有一个滚动视图,其中包含许多子项。我想用不同的项目列表刷新滚动视图的内容。
滚动视图中包含的每个项目都附加了一个或多个事件监听器。
我应该在删除项目之前删除事件监听器吗?或删除项目是否会自动清除所有附加的事件侦听器?
我试图通过使主动侦听器不再存在的UI对象来确保不影响性能或内存消耗。
好问题。内存在移动设备上是“珍贵的”(具有最好的Gollum口音),并且造成泄漏肯定是导致崩溃,星级降低和用户不满意的途径。关于添加/删除视图和关闭窗口时如何处理垃圾收集有一些误解。关闭窗口会清理子视图,使用该.remove()
方法实际上会从内存中删除视图,等等。
在这个特殊的用例中,由于没有代码示例,因此我不得不推测一下如何创建子视图以及如何处理和设置事件侦听器,但是总的来说,这应该适用于大多数情况。
对于您的视图,我们假设您已经在Alloy视图文件中定义了ScrollView(id ='scrollView'),并且创建子视图的操作如下:
var subViews = [];
function _doSomething(){
alert('Something!');
}
for(i=0;i<10;i++){
var view = Ti.UI.createView({
backgroundColor:"#ececec",
height:50,
width: Ti.UI.FILL});
view.addEventListener('click', _doSomething);
subViews.push(view);
$.scrollView.add(view);
}
在上面的示例中,我们正在做一些事情:
1)我们创建一个数组来保存所有子视图,因此,如果我们需要引用一个特定的视图(啊哈,用于垃圾回收),我们可以
2)我们声明了事件函数,而不是与事件侦听器内联创建它,因此我们可以根据需要进行清理
现在,在任何用例中,我们都准备好管理此特定视图的内存。
现在假设您决定删除该特定ScrollView的所有视图,并使用类似以下内容的方法:
$.scrollView.removeAllChildren();
然后开始添加新视图。您的子视图消失了吗?那事件监听器呢?
答案-他们仍然闲逛。它易于检查,只需抛出
console.log(subViews.length);
在代码末尾,您用于添加视图(如上面的示例),您将看到类似这样的内容。
[INFO] 10
[INFO] 20
[INFO] 30
[INFO] 40
[INFO] 50
[INFO] 60
[INFO] 70
因此,有了这些信息,您现在应该对准备好摆脱子视图时如何清理子视图有了个好主意。这是一个示例:
function cleanUpSubViews(){
while(subViews.length) {
var v = subViews.pop();
v.removeEventListener('click', _doSomething);
v = null;
};
}
通常,清理subViews应该清除事件侦听器,但是要确保我建议您在上面的代码中添加该行以确保对其进行处理。
您可以在此处查看工作示例:https : //gist.github.com/grantges/884ae6b2fd8570a89109
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句