我正在开发钛合金应用程序。我有多个xml文件。每个xml文件都有相同的视图,每个视图ID和功能都相同。这个approch是正确的,或者我必须为所有对象分配不同的id和不同的命名函数,以防止内存泄漏。我的意思是每个xml的代理在内存上是相同还是不同?
home.xml
<Alloy>
<Window id="home">
<View id="Container" onTouchend="fooFunction"> </View>
</Window>
</Alloy>
detail.xml
<Alloy>
<Window id="detail">
<View id="Container" onTouchend="fooFunction"> </View>
</Window>
</Alloy>
other.xml
<Alloy>
<Window id="other">
<View id="Container" onTouchend="fooFunction"> </View>
</Window>
</Alloy>
关闭窗口时如何从内存中清除对象以防止内存泄漏?
用于防止内存泄漏的窗口关闭事件已编辑;
$.detail.addEventListener("close", function() {
// this listerner creates when window open for paused app event
Ti.App.removeEventListener("app:RefreshJson", fncRefreshJson);
$.Container.removeAllChildren();
$.detail.removeAllChildren();
$.removeListener();
$.destroy();
// listview creates on the fly when new window opens
// then I am adding it into $.Container
listView = null;
$.detail = null;
});
答案 0 :(得分:0)
来自docs: ID对于每个视图应该是唯一的,但不是全局的,因此多个视图可以包含具有相同ID的组件。
你的方法很好。几个笔记
id="home"
,那么在home.js中,您仍然会将窗口对象引用为... $.home
,因为这是文件名。View id="container"
可能是最佳选择。就个人而言,我发现在我的所有窗口中使用相同的标识符比较容易,例如<Window id="win">
(和控制器中的$.win
),所以当在视图控制器之间切换时,我不会必须查找或记住此特定窗口的名称或文件名。
答案 1 :(得分:0)
我关于这个主题的文章是三年之久。但是,在快速扫描中,我认为今天仍然适用。 http://www.tidev.io/2014/03/27/memory-management/
当我关闭窗口以防止内存泄漏时如何从内存中清除对象?
取决于:
如果窗口是选项卡组的一部分,则只要应用程序正在运行,它就会保留在内存中。
如果它是在Android的导航组或窗口堆栈中打开的窗口,则取决于您如何实例化窗口。
// if you do this:
var win = Alloy.createController('detail').getView();
win.open();
// then to clean up, after
win.close()
// you need to
win = undefined;
// which is why it's better to do this if you can
Alloy.createController('detail').getView().open();
// then, inside of detail, you'd call its Window.close()
// method which would close the window and remove the
// last reference in memory and the object would be GC'd
顺便说一句,如果您真的创建了多个窗口,其代码与您上面显示的类似,那么您可能应该创建一个窗口小部件。在实例化窗口小部件时,您将传递定义特征(选项,名称,子视图等)。此技术不一定有助于内存管理或性能。但是,它将有助于消除重复的代码。