0

Firefox 拡張機能で jQuery タブ ライブラリを使用しています。私の拡張機能では、タブ機能が正常に機能しています。ただし、ゾンビ コンパートメントを作成しています。

これは私がタブを使用している方法です:

$j(mydiv).find('#targetid').tabs({selected: 2});

この行にコメントして拡張機能をインストールすると、メモリリークはありません。何が起こっているのですか?

4

1 に答える 1

1

問題は、jQuery UI がブラウザー ウィンドウに存在し、ブラウザー ウィンドウが開いている限り「生きている」ことです。ただし、タブはコンテンツ タブにあり、そのタブを閉じるとすぐに消えます。jQuery UI は、タブへのローカル参照をどこかに保持する必要があり、その参照により、タブが閉じられた後でもタブがガベージ コレクションされません (ゾンビ コンパートメント)。1 つの解決策は、その参照を見つけて削除することです。しかし、この方法で解決したとしても (jQuery について十分な知識がないのでできません)、jQuery UI は Web ページで実行するように設計されているため、この種のメモリ リークは考慮されていないため、問題は後で再発する可能性があります。そこの。

より堅牢なソリューションは、担当する UI と同じコンテキストで jQuery UI を実行することです。この方法でタブを閉じると、jQuery UI とそのウィジェットの両方が破棄されます - ゾンビ コンパートメントはもうありません。これは、たとえばメッセージ マネージャを使用して実行できます。

// Load content script into the current tab
var contentScriptURL = "chrome://.../content/contentScript.js";
gBrowser.selectedBrowser.messageManager.loadFrameScript(contentScriptURL, false);

そして、 mozIJSSubscriptLoadercontentScript.jsを使用して jQuery と jQuery UI をそのコンテキストにロードします。

var scriptLoader = Components.classes["@mozilla.org/moz/jssubscript-loader;1"]
                     .getService(Components.interfaces.mozIJSSubScriptLoader);
scriptLoader.loadSubScript("chrome://.../content/jquery.js");
var jQuery = jQuery.noConflict(true);
scriptLoader.loadSubScript("chrome://.../content/jquery-ui.js", jQuery);
...
$j(mydiv).find('#targetid').tabs({selected: 2});

このコンテンツ スクリプトは、オーバーレイで実行されているスクリプトと同じクロム権限を持っていますが、タブが閉じられるとアンロードされます。また、そのタブのコンテンツに保持されている可能性のある参照も一緒にアンロードされます。

于 2012-05-25T08:15:36.440 に答える