2017-06-22 79 views
0

我正在开发钛合金应用程序。我有多个XML文件。每个XML文件都有相同的视图,每个视图的ID和功能都是一样的。这种认识是正确的,或者我必须为所有对象分配不同的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

docsID应该按次唯一的,但不是全局的,用相同的ID,所以多个视图可以有分量。

你的方法很好。几个注释

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

就个人而言,我发现它更容易使用我所有的Windows相同的标识符,如<Window id="win">(和$.win控制器),所以视图控制器之间切换时左右,我没有抬头或者记住该特定窗口的名称或文件名称。

+0

我用我的控制器代码编辑我的问题?你有什么建议?这是正确的做法吗? – Kerberos

+0

你有内存泄漏的具体问题吗?您可能需要针对您遇到的问题发布问题。另请参阅[管理内存](http://docs.appcelerator.com/platform/latest/#!/guide/Managing_Memory_and_Finding_Leaks)。至于你的代码,'$ .destroy()'只在做[合金数据绑定]时需要(http://docs.appcelerator.com/platform/latest/#!/guide/Destroying_Data_Bindings)。是的,您确实需要删除全局事件侦听器。我会尽量避免它们,而是使用诸如主干事件之类的东西。 –

+0

我打开10多个窗口。父窗口不关闭。你建议任何算法的多个Windows应用程序? – Kerberos

0

我在这个主题的文章是三岁。但是,在快速扫描中,我认为这一切仍然适用于今天。 http://www.tidev.io/2014/03/27/memory-management/

当我关闭窗口以防止内存泄漏时,如何清除内存中的对象?

这取决于:

如果窗口是一个标签基团的一部分,则其将保持在存储器只要应用程序正在运行。

如果它是在导航组中打开的窗口或Android中的一堆窗口,它将取决于您如何实例化窗口。另外,如果你真的创建了多个窗口,其代码类似于你上面显示的,也许你应该创建一个Widget。在实例化小部件时,您会传递定义特性(选项,名称,子视图等)。这种技术不一定有助于内存管理或性能。但是,它将有助于消除重复的代码。

+0

非常感谢。那么win = null和win = undefined之间有什么不同呢? – Kerberos

+0

我用我的控制器代码编辑了我的问题?你有什么建议?这是正确的做法吗? – Kerberos

+0

在从Titanium的内存中释放本机对象方面,'win = null'和'win = undefined'确实没有区别。 null和undefined之间存在细微差异,但是对于您在此处所做的事情而言,这并不重要,并且更像是开发人员的偏好或习惯。你可能不需要'$ .removeListener();'如果你不使用Alloy数据绑定和全局集合,你不需要'$ .destroy();'但是,你的其他更新的控制器代码看起来不错,我可以告诉。 – skypanther