所以,我正在用 as3 做一个非常大的项目,我想知道如何禁用垃圾收集器,因为用户可能会长时间使用,我不希望他或她被切断,因为垃圾收集器在某处删除了一些监听器现在应该需要了。
是否有比转到每个侦听器并在命名侦听器后添加“false,0,true”扩展名更简单的方法来禁用垃圾收集器?
所以,我正在用 as3 做一个非常大的项目,我想知道如何禁用垃圾收集器,因为用户可能会长时间使用,我不希望他或她被切断,因为垃圾收集器在某处删除了一些监听器现在应该需要了。
是否有比转到每个侦听器并在命名侦听器后添加“false,0,true”扩展名更简单的方法来禁用垃圾收集器?
不,这是不可能的,但你害怕的并不是真正的问题。
此外,使事件侦听器变弱并不会禁用垃圾收集器,事实上,如果这是留给它们的唯一引用,它会使它们设置为的任何对象都有资格进行垃圾收集。
这实际上是可能的,但它需要纪律......
当一个 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();
希望这可以帮助。