1

所以,我正在用 as3 做一个非常大的项目,我想知道如何禁用垃圾收集器,因为用户可能会长时间使用,我不希望他或她被切断,因为垃圾收集器在某处删除了一些监听器现在应该需要了。

是否有比转到每个侦听器并在命名侦听器后添加“false,0,true”扩展名更简单的方法来禁用垃圾收集器?

4

2 回答 2

4

不,这是不可能的,但你害怕的并不是真正的问题。

此外,使事件侦听器变弱并不会禁用垃圾收集器,事实上,如果这是留给它们的唯一引用,它会使它们设置为的任何对象都有资格进行垃圾收集。

于 2013-03-04T10:10:35.587 回答
3

这实际上是可能的,但它需要纪律......

当一个 as3 对象失去对其他对象的所有引用时,它就成为垃圾回收的候选对象。为避免这种情况,您可以使用以下方法:

当您需要一个对象在内存中持久存在时,请将其绑定到可访问的某个位置。

这里我提供了一个示例代码。

首先创建下面的类:

package your.package.path;

public class noGc {

protected static var vault:Array = [];

// In case we forget that noGc should stay static....   
public function noGc(){throw new Exception('Error: Instance from STATIC noGc');}

public static function hold(o: *): void {
   if(vault.indexOf(o)==-1)vault.push(o); // no multiple references in vault 
}

public static function release(o: *): Boolean {
var i: int = vault.indexOf(o);
    if(i == -1)return(false);            // return value is for information only
    vault.splice(i,1);                   // remove object from vault
    return(true);
}

public static function releaseAll(): void {
    vault.length = 0;
}

} // end class noGc

避免对“yourObject”进行 gc

noGc.hold(yourObject);

允许 gc on "yourObject" 返回

noGc.release(yourObject);

对于正常的代码流,在创建对象后立即开始保存对象。然后你应该在使用结束时释放它们。

此外,您必须密切关注异常,因为异常会破坏正常流程,您应该处理它们并释放异常后变得无关紧要的对象。

忘记持有的对象意味着使用不必要的内存,也就是内存泄漏

正如我之前所说,它需要纪律。

最后,当您需要擦除所有持有使用的对象时,

noGc.releaseAll();

希望这可以帮助。

于 2013-03-04T11:07:10.603 回答