项目控制器超出范围后会被销毁(内存泄漏)

时间:2014-05-15 18:31:55

标签: ember.js ember-data

我的应用中存在一些内存泄漏问题。在关注此博客:https://github.com/emberjs/ember.js/issues/3444之后,我尝试在每个循环中实现视图以清除项目控制器,如下所示:

{{#each models itemController="someController" itemViewClass="AS.AutoCleanupView"}}
     ....
{{/each}}

我的autoCleanupView看起来像:

AS.AutoCleanupView = Ember.View.extend({

    willDestroyElement: function () {
        //console.log("Auto cleaned : "+this.get('controller'));
        this.get('controller').destroy();
    }

});

现在我可以看到,在控制器上调用了destroy,但只是为了确保控制器本身可以推送一些全局对象。我这样做的方法是在我的初始化函数中使用这段代码:

initialize: function () {
    AS.collectObjects.push(this);
}.on('init'),

所以现在当我转移到其他路线时,我期待我的控制器完全被摧毁并回收内存。但是当我检查AS.collectObjects的内容时,控制器仍在那里,但是他们的isDestroyed属性设置为true。什么时候控制器真的被内存完全冲洗了呢?

你们采取什么方法来克服内存泄漏。我已经尝试过使用chrome profiler,但它只是如此冗长,我真的无法解决核心原因。我确实在控制器的willDestroy钩子中销毁了我手动创建的所有ember对象。 任何建议将不胜感激。谢谢。 哦顺便说一句,我忘了提到这只是发生在我们心爱的IE8浏览器中。

1 个答案:

答案 0 :(得分:0)

添加对项目的引用将防止垃圾收集发生。 GC只有当对象不再被任何东西引用时才会回收它们,它会在它感觉到它时立即回收它。

观察对象是否正确处理的唯一方法是使用浏览器内的探查器。

当天的轶事声明,我使用Ember获得了三个企业应用程序并且没有注意到任何类型的内存泄漏,你确定它是Ember吗?