バックボーンビューを作成し、イベントにハンドラーをアタッチし、ユーザー定義クラスをインスタンス化する非常に単純なテストケースを作成しました。このサンプルの[削除]ボタンをクリックすると、すべてがクリーンアップされ、メモリリークは発生しないはずです。
コードのjsfiddleは次のとおりです:http ://jsfiddle.net/4QhR2/
// scope everything to a function
function main() {
function MyWrapper() {
this.element = null;
}
MyWrapper.prototype.set = function(elem) {
this.element = elem;
}
MyWrapper.prototype.get = function() {
return this.element;
}
var MyView = Backbone.View.extend({
tagName : "div",
id : "view",
events : {
"click #button" : "onButton",
},
initialize : function(options) {
// done for demo purposes only, should be using templates
this.html_text = "<input type='text' id='textbox' /><button id='button'>Remove</button>";
this.listenTo(this,"all",function(){console.log("Event: "+arguments[0]);});
},
render : function() {
this.$el.html(this.html_text);
this.wrapper = new MyWrapper();
this.wrapper.set(this.$("#textbox"));
this.wrapper.get().val("placeholder");
return this;
},
onButton : function() {
// assume this gets .remove() called on subviews (if they existed)
this.trigger("cleanup");
this.remove();
}
});
var view = new MyView();
$("#content").append(view.render().el);
}
main();
ただし、Google Chromeのプロファイラーを使用して、これが実際に事実であることを確認する方法は不明です。ヒーププロファイラーのスナップショットには膨大な数のものが表示されますが、何が良い/悪いかをデコードする方法がわかりません。これまでに見てきたチュートリアルでは、「スナップショットプロファイラを使用する」か、プロファイラ全体の動作に関する非常に詳細なマニフェストを教えてください。プロファイラーをツールとして使用することは可能ですか、それとも全体がどのように設計されたかを本当に理解する必要がありますか?
編集:次のようなチュートリアル:
私が見たものから、そこにあるより強い素材のいくつかを代表しています。ただし、3スナップショットテクニックの概念を紹介する以外に、実用的な知識に関しては(私のような初心者にとって)ほとんど提供していません。'DevToolsの使用'チュートリアルは実際の例では機能しないため、曖昧で一般的な概念の説明はあまり役に立ちません。「Gmail」の例については:
リークを発見しました。それで?
[プロファイル]パネルの下半分で、リークしたオブジェクトの保持パスを調べます
割り当てサイトを簡単に推測できない場合(イベントリスナーなど):
JSコンソールを介して保持オブジェクトのコンストラクターをインスツルメントし、割り当てのスタックトレースを保存します
クロージャーを使用していますか?適切な既存のフラグ(つまり、goog.events.Listener.ENABLE_MONITORING)を有効にして、構築中にcreationStackプロパティを設定します。
それを読んだ後、私はもっと混乱していると思います。そして、繰り返しますが、それは私に物事を行うように指示するだけであり、方法を指示することではありません。私の見解では、そこにあるすべての情報は曖昧すぎるか、すでにプロセスを理解している人にしか意味がありません。
これらのより具体的な問題のいくつかは、以下の@Jonathan Naguinの回答で提起されています。
main
1回ではなく10,000回呼び出すことであり、最後に使用中のメモリが多くなるかどうかを確認することです。