2016-03-22 15 views
0

G/temizlemek gerekir buOmurga belleği sızıntısı çalışmıyor mu? yönlendirici olarak

  function test() { 
       self.topbarView = new TopbarView(); 
       self.topbarView.render(); 
       GhostviewHunter.addView(self.topbarView); 
      } 

      function clean() { 
       console.log(GhostviewHunter.currentViews.length); 
       GhostviewHunter.clean(); 
      } 
      setInterval(test, 1000); 
      setInterval(clean, 1000); 

ghostviewhunter görünümleri kaldırmak yapın:

define('ghostviewHunter', [], function() { 

    var GhostviewHunter = function() {}; 

    GhostviewHunter.prototype.currentViews = []; 

    GhostviewHunter.prototype.addView = function(view) { 
     this.currentViews.push(view); 
    } 

    GhostviewHunter.prototype.clean = function() { 
     _.each(this.currentViews, function(view) { 
      view.remove(); 
     }); 
     this.currentViews.length = 0; 
    } 

    GhostviewHunter.__instance = null; 

    GhostviewHunter.getInstance = function() { 
     if(GhostviewHunter.__instance == null) { 
      GhostviewHunter.__instance = new GhostviewHunter(); 
     } 
     return GhostviewHunter.__instance; 
    } 

    return GhostviewHunter.getInstance(); 

}) 

Topview bir model alma olduğunu, model setInterval fonksiyonu ile her 1seconde güncellenir.

Bunu remove(); Ben uygulamayı izlerken, bellek sızıntısı çok hızlı olması yeterli olurdu.

Herhangi bir fikrin var mı?

DÜZENLEME: TOPBARVIEW

define('topbarView', [ 
    'backbone', 
    'parameterManager', 
    'text!views/topbarView/topbarTemplate.html', 
    'drupalidModel', 
    'weatherModel', 
    'refreshTime', 
    'dateParser' 
    ], function(Backbone, ParameterManager, TopbarTemplate, DrupalidModel, WeatherModel, RefreshTime, DateParser) { 

    var TopbarView = Backbone.View.extend({ 
     el: '#topbar', 

     template: _.template(TopbarTemplate), 

     events: {}, 

     initialize: function() { 
      var self = this; 
      _.bindAll(this, 'render', 'startDateRefresh'); 
      this.dateParser = new DateParser(); 
      self.startDateRefresh(); 
      setInterval(self.startDateRefresh, RefreshTime.date); 
      this.initWeatherModel();   
     }, 

     render: function() { 
      var self = this; 
      var data = { 
       picto_url : ParameterManager.get('WEATHER_RESOURCE_URL') + ParameterManager.get('WEATHER_PICTO_CODE') + ".png", 
       date: self.date 
      } 
      this.$el.html(this.template({data: data})); 
     }, 

     initWeatherModel: function() { 
      var self = this; 
      var weather_url = ParameterManager.get('WEATHER_URL'); 

      if(weather_url === null) { 
       this.drupalidModel = new DrupalidModel(); 
       this.drupalidModel.fetch({ 
        success: function(model, response) { 
         var center_id_num = model.get('center_id_num'); 
         ParameterManager.set('DRUPAL_CENTER_ID_NUM', center_id_num); 
         ParameterManager.constructWeatherUrl(); 
         self.model = new WeatherModel(); 
         self.listenTo(self.model,'change', self.render); 
         self.startModelRefresh(); 
        }, 
        error: function() { 
         console.log("Failed to fetch center id!"); 
        } 
       }) 
      } else { 
       this.model = new WeatherModel(); 
       self.listenTo(self.model,'change', self.render); 
       this.startModelRefresh(); 
      }; 
     }, 

     startModelRefresh: function() { 
      var self = this; 
      this.modelRefresh = function() { 
       self.model.fetch(); 
      }.bind(this); 
      self.modelRefresh(); 
      setInterval(self.modelRefresh, RefreshTime.weather);   
     }, 

     stopModelRefresh: function() { 
      var self = this; 
      clearInterval(self.modelRefresh); 
     }, 

     startDateRefresh: function() { 
      var self = this; 
      this.date = this.dateParser.classicDate(); 
      this.render(); 
     } 

    }); 

    return TopbarView; 

}) 
+2

'TopbarView' nedir? Bir [mcve] oluşturabilir misin? –

+0

Bu, belirli aralıklarla hatalı bir yönetimden kaynaklandığını sanıyorum, ancak yanlış yaptığım şeyi net olarak anlayamıyorum –

+0

Ikinci T J'nin bir MCVE isteği. Chrome geliştirici araçlarında, bellek kullanımını izlemek için Zaman Çizelgesi'ni kullanın ve 'topla çöp kutusuna '(genellikle çöp kutusu simgesi)' ye ve özellikle de' clean() 'işlevini çağırmadan önce ve sonra basın. Ne tür bir bellek sızıyorsa yalıtın. Bunu yayına ekle. Bellek sızıntısının Omurga yanlış kullanımından kaynaklanamayacağına, ayrıca önemsiz bir kapatma sızıntısına neden olabileceğini unutmayın. –

cevap

0

fbynite öne sürdüğü gibi, aralık (lar) temizlemek gerekiyordu doğru değildir kodunuzu, sen clearInterval için aralık id geçmelidir. Bunun dışında numaralı telefonu aramıyorsunuz. Görünümü kaldırmadan önce tüm dış referansların düzgün şekilde kaldırıldığından emin olmalısınız. Mesela ben görünümü çıkarmadan önce aralığını temizler bir imha yöntemi ekledikten:

GhostviewHunter.prototype.clean = function() { 
    _.each(this.currentViews, function(view) { 
      view.destroy(); 
    }); 
    this.currentViews.length = 0; 
} 

veya hatta geçersiz kılabilirsiniz:

var TopbarView = Backbone.View.extend({ 
    el: '#topbar', 
    template: _.template(TopbarTemplate), 
    events: {}, 
    initialize: function() { 
    }, 
    render: function() { 
    }, 
    modelRefresh: function() { 
    this.model.fetch(); 
    }, 
    startModelRefresh: function() { 
    this.modelRefresh(); 
    this.intervalId = setInterval(_.bind(this.modelRefresh,this), RefreshTime.weather); 
    }, 
    stopModelRefresh: function() { 
    clearInterval(this.intervalId); 
    }, 
    destroy: function() { 
    this.stopModelRefresh(); 
    this.remove(); 
    } 

}); 

Artık reklam GhostviewHunter doğrudan remove aramak yerine bunu çağırmalıdır gibi bir şey için remove yöntem kendisi:

remove: function(){ 
    this.stopThisInterval(); 
    this.stopThatInterval(); 
    this.cleanUpSomethingElse(); 
    Backbone.View.prototype.remove.call(this); 
} 

ve hayalet şeysi görüşmesi remove kendisi. Eğer bile temizlemek için çalışırken değiliz startDateRefresh çağıran başka aralığını sahip


Not ... Buna benzer şekilde bu tür bütün temizlemek gerekir.

Ve bir yan not olarak

, şiddetle bu eg tamamen gereksiz olduğu self = this spam durdurmak önermek:

stopModelRefresh: function() { 
     var self = this; 
     clearInterval(self.modelRefresh); 
// Why..? Nothing here changes the context? 
}, 

ve ben de yinelemeli/başarılı çağırmak yerine başarısız getirme akım kez modelRefresh arayarak önermek Bir önceki getirinin tamamlandığını garanti etmediğiniz bir aralıktan