2016-06-08 37 views
1

假設我有一個帶有3個視圖(窗體)的ScrollableView,那些窗體視圖至少有10個字段,請看這個例子。有必要刪除視圖?爲了清理合金控制器(內存/性能)

index.js

$.content.add(Alloy.createController('scrollable').getView()); 

scrollable.js

$.scrollableView.addView(Alloy.createController('form',{ 
    fields:[ 
     {label:'field 1',type:'text'}, 
     {label:'field 1',type:'date',value:'2016-06-08'}, 
     ... 
    ] 
}).getView()); 

$.scrollableView.cleanup = function() { 

    $.destroy(); 

    $.off(); 

    for(var i = parseInt($.scrollableView.views.length); i > 0; i--) if($.scrollableView.views[i-1]) { 

     if($.scrollableView.views[i-1].cleanup) $.scrollableView.views[i-1].cleanup(); 
     $.scrollableView.views[i-1] = null; 
     $.scrollableView.removeView($.scrollableView.views[i-1]); 
    } 

    $ = args = null; 
}; 

form.js

for(var i in args.fields) $.form.add(Alloy.createController('field',args.fields[i]).getView()); 

$.form.cleanup = function() { 

    $.destroy(); 

    $.off(); 

    for(var i in $.form.children) { 

     if($.form.children[i].cleanup) $.form.children[i].cleanup(); 
     $.form.children[i] = null; 
    } 

    $.form.removeAllChildren(); 

    $ = args = null; 
}; 

當我清理所有的控制器,我還是不明白什麼是必須要做的。

當我想刪除ScrollableView時,我在每個View上運行清理功能,它是子級。

  • 我應該在所有的ScrollableView視圖上運行清理功能嗎?

  • 我應該清空所有的ScrollableView視圖嗎?

  • 我應該刪除所有的ScrollableView視圖嗎?

  • 我應該在所有的View兒童上運行清理功能嗎?

  • 我是否應該清空所有View子項?

  • 我應該刪除所有的View兒童嗎?

UPDATE

在這種情況下,我還需要清除所有的字段?或將數據設置爲空將解決這個問題?

form.js

var args = arguments[0], 
    data = { 
     fields:{} 
    }; 

for(var i in args.fields) { 

    data.fields[args.fields[i].label] = Alloy.createController('field',args.fields[i]).getView(); 

    $.form.add(data.fields[args.fields[i].label]); 
} 

$.form.cleanup = function() { 

    $.destroy(); 

    $.off(); 

    //this is needed? 
    for(var i in data.fields) { 

     if(data.fields[i].cleanup) data.fields[i].cleanup(); 
     data.fields[i] = null; 
    } 
    //this is needed? 

    $ = data = args = null; 
}; 

無論如何,如果我的領域有一個事件偵聽器添加像「變」或「點擊」,我必須清理功能刪除它,對嗎?

+0

如果你'null'的數據,所有對不同視圖的引用也會丟失。所以這將解決它 –

回答

2

不需要刪除所有視圖,清理內存所需的唯一操作是刪除大多數父視圖,以及對父視圖的引用中大部分父視圖中的任何內容的所有引用。

所以在你的情況下,你只需要刪除ScrollableView和在滾動視圖內你需要做$.off()。僅在使用數據綁定(模型/集合)時才需要$.destroy()

因爲你的孩子的意見從來沒有一個引用(變量),所以沒有必要刪除它們。它由Appcelerator/JavaScript自動處理,並在時間到時用垃圾回收進行清理。

注意:垃圾收集不會在刪除視圖後直接發生,因此您可能仍會增加內存使用量。 JavaScript和本地平臺都有自己的垃圾收集。

您可以在這個article on TiDev中瞭解更多關於內存管理的內容,這個內容仍然非常相關。

在您更新的問題中,您設置了data對象中的所有子視圖。數據對象也將放棄所有對視圖的引用,所以這應該足夠了。

+0

謝謝,我不使用模型或集合,所以沒有必要$ .destroy和$ .off?我認爲這是必要的,http://www.tidev.io/2014/09/18/cleaning-up-alloy-controllers/ –

+0

還有一件事,如果我參考表格,它是領域,我需要在我的清理函數中將它們設置爲null,對吧? –

+0

您只需要使用'$ .off'只有'$ .destroy()'用於數據綁定。如果你有表單的所有孩子的引用,你需要將它們全部歸零。 –