2017-06-22 82 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