2016-01-13 175 views
1

考慮以下幾點:內存管理

SomeView = Backbone.View.extend({ 
     render0: function() { 
      var view0 = new View0(); 
      view0.setElement("#right-block"); 
      view0.render(); 
     }, 
     render1: function(event) { 
      var view1 = new View1(); 
      view1.setElement("#right-block"); 
      view1.render(); 
     }, 

    }); 

如果我打電話render0()然後render1,會發生什麼對象view0?我必須明確摧毀舊觀點嗎?

回答

5

只要DOM元素#right-block存在,您的view0將保留在內存中。因爲DOM元素上的事件處理程序指向您的視圖的方法,所以它不會被垃圾收集。

理想情況下,您應該調用view0.remove(),它將從DOM中刪除該元素,並且還會調用stopListening()

但是在您的示例代碼中,如果您這樣做,元素#right-block將從DOM中刪除,並且view1.setElement("#right-block");將無法​​按預期工作。

在這種情況下,嘗試調用view0.undelegateEvents(); view0.stopListening();,如果沒有其他參照視圖實例,它會被垃圾收集

+0

如果要將「View0#remove」重寫爲「undelegateEvents」和「stopListening」(如果它打算與現有元素一起使用),那麼您總是可以調用'remove'。 –

0

不,你不必破壞舊的觀點。自己超出範圍的對象中的變量不必手動清除。當它們超出範圍或父對象被刪除時,其中包含的數據也將有資格進行垃圾回收。

+0

我明白了。我擔心的是,儘管它們在render()後超出了範圍,但它們仍然沒有被垃圾收集,因爲視圖仍然在運行。 – khajvah