在我的顶部,我bootstrap.js
定义了一堆lazyGetter
s,而不是 JSM:
const myServices = {};
Cu.import('resource://gre/modules/XPCOMUtils.jsm');
XPCOMUtils.defineLazyGetter(myServices, 'sss', function(){ return Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService) });
我听说你必须unload
导入模块。但是你为lazyGetter
s 创建的“模块”呢?我将如何卸载那些?我会做一个delete myServices
吗?
如果我执行一个全局变量delete
,myServices
这是否意味着我应该在卸载时删除所有全局变量?
我在这里读到:忘记在无需重启的附加组件中卸载 JavaScript 模块
忘记在无需重启的附加组件中卸载 JavaScript 模块
泄漏的另一个常见原因是忘记在引导加载项中卸载 JavaScript 代码模块。通过查看 about:compartments 或 about:memory 无法检测到这些泄漏,因为此类模块位于主系统隔间内。
此外,当您的插件更新并重新启用时,将使用仍加载的先前模块版本,这可能会完全破坏您的插件。
以下示例显示了如何再次卸载模块 (bootstrap.js):
Components.utils.import("resource://gre/modules/Services.jsm"); function startup(data, reason) { // This assumes your add-on did register some chrome Components.utils.import("chrome://myaddon/content/mymodule.jsm"); } function shutdown(data, reason) { if (reason != APP_SHUTDOWN) { // No need to do regular clean up when the application is closed // unless you need to break circular references that might negatively // impact the shutdown process. return; } // Your add-on needs to unload all modules it ships and imported! Components.utils.unload("chrome://myaddon/content/mymodule.jsm"); }
注意:不属于您的附加组件的模块(例如 Services.jsm)不应由您的附加组件卸载,因为这可能会导致错误和/或性能下降,并且实际上会增加内存使用量。