了解合金结构

时间:2017-06-22 10:20:50

标签: titanium-mobile appcelerator-titanium titanium-alloy

我正在开发钛合金应用程序。我有多个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;

    });

2 个答案:

答案 0 :(得分:0)

来自docs ID对于每个视图应该是唯一的,但不是全局的,因此多个视图可以包含具有相同ID的组件。

你的方法很好。几个笔记

  • 如果视图中的顶级组件省略了id,则合金将采用文件名作为标识符。因此,如果您离开id="home",那么在home.js中,您仍然会将窗口对象引用为... $.home,因为这是文件名。
  • camelCasing是Alloy中常用的格式,因此View id="container"可能是最佳选择。
  • 使用数据绑定可以发生Alloy特有的内存泄漏,因此绑定必须为properly destroyed。除此之外,应该应用相同的Memory Management提示。最重要的是不使用全局事件监听器。如果需要,您可以使用Backbone Events代替。

就个人而言,我发现在我的所有窗口中使用相同的标识符比较容易,例如<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

顺便说一句,如果您真的创建了多个窗口,其代码与您上面显示的类似,那么您可能应该创建一个窗口小部件。在实例化窗口小部件时,您将传递定​​义特征(选项,名称,子视图等)。此技术不一定有助于内存管理或性能。但是,它将有助于消除重复的代码。