gpt4 book ai didi

javascript - 删除 Javascript blob?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:47:39 24 4
gpt4 key购买 nike

我正忙于摆脱这些愚蠢的事情。我有几个处理大量媒体文件的 Chrome 应用程序;其中一个我能够使用一堆“删除”和一个window.URL.revokeObjectURL这最终阻止了他们在 chrome://blob-internals/ 中建立起来,但是另一个,似乎没有任何帮助。我错过了什么吗?我确切地知道我什么时候完成这该死的事情,但我似乎无能为力。

具体来说,我在这样的 block 中使用文件对象:

ref.file(function(f) {
// Do some stuff...
// and now I'm done!
delete f
});

这是我的应用程序的实际来源:

https://github.com/pkulak/photo-importer

这是我认为我真正解决了问题的地方,但谁知道呢:

https://github.com/pkulak/drive-slideshow

最佳答案

这看起来像是内存泄漏。

JavaScript 没有您所说的“删除”功能,它会在属性和变量成为孤立对象时进行垃圾回收。 delete运算符就是实现这一目标的一种方法 - 它从 Object 中删除属性的定义。
正确使用 delete 意味着在属性上使用它,而不是在 variable 上使用。它对某些变量起作用的原因是因为全局命名空间中的 var 发生了什么(即它们成为 window 的属性)。这也意味着您不能删除参数。

此外,请注意,一旦一个函数完成调用,如果没有保持事件的引用,那么它的所有内部都将被 GC。

接下来,考虑

var o = {};
o.a = [];
o.b = o.a;
delete o.a;

o.b 现在是什么?

`o.b; // []`

即使我们删除了 o.a 引用,它仍然指向 Array。这意味着数组不会被垃圾回收。

那么这对您意味着什么?

要删除您的Blob,您需要销毁对它们的所有引用。

是的,撤销 URI 是其中的一部分,但您还需要删除整个代码中的引用。如果您发现这很困难,我建议您包装所有的 Blob,这样您至少可以将问题最小化。

var myBlob = (function () {
var key, o;
function myBlob(blob) {
var url;
this.blob = blob;
blob = null;
this.getURL = function () {
if (url) return url;
return url = URL.createObjectURL(this.blob);
};
this.dispose = function () {
if (url) url = URL.revokeObjectURL(url), undefined;
this.blob = null;
};
}
o = new Blob();
for (key in o)
(function (key) {
Object.defineProperty(myBlob.prototype, key, {
enumerable: true,
configurable: true,
get: function () {return this.blob[key];}
});
}(key));
o = key = undefined;
return myBlob;
}());

现在,使用 new myBlob(blob) 在创建 blob 的同时,而不是常规的 Blob 创建,不保留对 Blob 。然后当您完成 Blob 时,调用 myWrappedBlob.dispose(); 它应该释放它以进行 GC。如果真的有必要将 Blob 直接传递给某个东西,我就给了它 myBlob.blob 属性。

关于javascript - 删除 Javascript blob?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22899333/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com