删除Javascript blob?

删除Javascript blob?,javascript,google-chrome-app,Javascript,Google Chrome App,我在处理这些愚蠢的事情上花了不少时间。我有几个Chrome应用程序可以处理很多媒体文件;其中一个我能够使用一堆“delete”和一个window.URL.revokeObjectURL,最终阻止了它们在chrome://blob-internals/,但另一个,似乎没有任何帮助。我错过什么了吗?我完全知道我什么时候做完这该死的事情,但我似乎无能为力 具体地说,我在这样的块中使用文件对象: ref.file(function(f) { // Do some stuff... //

我在处理这些愚蠢的事情上花了不少时间。我有几个Chrome应用程序可以处理很多媒体文件;其中一个我能够使用一堆“delete”和一个
window.URL.revokeObjectURL
,最终阻止了它们在
chrome://blob-internals/
,但另一个,似乎没有任何帮助。我错过什么了吗?我完全知道我什么时候做完这该死的事情,但我似乎无能为力

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

ref.file(function(f) {
    // Do some stuff...
    // and now I'm done!
    delete f
});
以下是我的应用程序的实际来源:

这是一个我认为我确实解决了问题的地方,但谁知道呢:


这看起来像是内存泄漏

JavaScript没有您所说的“删除”功能,它会随着属性和变量的孤立而进行垃圾收集。操作符是实现这一点的一种方法-它从对象中删除属性的定义。
正确使用
delete
意味着将其用于属性,而不是
var
iable。它对某些变量起作用的原因是全局名称空间中的
var
发生了什么(即它们成为
window
的属性)。这也意味着您不能
删除
参数

此外,请注意,一旦函数完成调用,如果没有任何引用保持活动状态,那么它的所有内部将被GC调用

接下来,考虑

var o = {};
o.a = [];
o.b = o.a;
delete o.a;
现在什么是离岸价

`o.b; // []`
它仍然指向数组,即使我们删除了
o.a
引用。这意味着数组不会被垃圾收集

这对你来说意味着什么

要清除blob,需要销毁对它们的所有引用

是的,撤销URI是其中的一部分,但是您还需要在整个代码中删除引用。如果你觉得这很困难,我建议你把所有的斑点都包起来,这样你至少可以把问题降到最低

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;
}());

现在,在创建Blob时立即使用
newmyblob(Blob)
,而不是常规的Blob创建,不保留对Blob的其他引用。然后在完成Blob后,调用
myWrappedBlob.dispose()并且它应该将其释放为GC'd。如果真的需要将Blob直接传递到某个对象中,我给它属性
myBlob.Blob

是的,您可能是对的。我保留了一个文件引用列表,可能是我使用引用创建的每个blob仍然保存在那里。我会在处理完这些东西后尽快把它们处理掉。作为后续,看起来应用程序中从来没有出现过漏洞,尽管内部的水滴已经填满了。我猜Chrome不会删除对文件系统blob的引用,但它们实际上不会对工作内存产生影响,因为它们显然不在内存中。@PhilKulak你从哪里读到blob不在内存中的?“我正在处理类似的问题。”帕布罗约默,不知道,对不起。到现在已经很久了,我对这个项目几乎什么都不记得了D