2011-03-27 79 views
7

我有一个程序,使用Javascript作为脚本语言绑定到一个更大的C++应用程序。我可以交换使用V8和webkit,但底层运行时对这个问题应该不重要。垃圾收集关闭规则与Javascript

在这个应用程序中,我有动态创建的对象会收到回调。我将创建这个回调像这样绑定...

function f() { 
    var obj = CreateNewCallbackObj(); 
    obj.onCallback = dowork; // dowork is a function 
} 

显然,这将有GC问题,因为OBJ已经超出了范围,并最终会被删除。

我想要的是让对象自我管理它的一生。该对象最终会收到一个回调,表示它的生命即将结束,如果发生这种情况,它可以删除它自己。

一个想法是通过添加一个obj.myself = obj来自引用。这似乎是错误的做法,但它可能工作,除非垃圾收集算法很聪明。

有没有正确的方法来做到这一点?没有用于存储对象的基础持久性DOM,所有JS对象都根据需要动态分配,但需要一些方法在JS引擎中保留。

回答

7

自引用将而不是保证任何东西都活着。事实上,大约没有自我尊重的GC'd语言(我知道)使用单独的refcounting实现。甚至不要想到滥用GC算法或任何其他实现定义的细节 - 这就是疯狂。

作为替代方案:创建一些总是可到达的(例如全局)对象,其保持所有这些对象(从而使他们活着),并提供到删除对象的方法。然后请别人提供参考 - 甚至更好,不要担心这一点。 GC的重点在于,当内存被释放时,你不应该(必须)知道/关心。

您还可以添加alive属性,检查在所有方法的开始处,如果在调用方法时产生错误,当然这不是保证,但它可以帮助调试。