所以,我正在用as3制作非常庞大的项目,我想知道如何禁用垃圾收集器,因为用户可能会长时间使用我不希望他或她被切断,因为垃圾收集器被删除现在需要一些听众。
是否有更简单的方法来禁用垃圾收集器,而不是转到每个侦听器并在命名侦听器后添加“false,0,true”扩展名?
答案 0 :(得分:4)
不,这是不可能的,但你害怕的并不是真正的问题。
此外,使事件监听器变弱并不会禁用垃圾收集器,事实上,如果这是唯一的参考资料,它会将它们设置为符合垃圾收集条件的任何对象。
答案 1 :(得分: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使用“yourObject”返回
noGc.release(yourObject);
对于普通代码流,在创建对象后立即开始保持对象。 然后你应该在使用结束时释放它们。
此外,您必须密切注意例外,因为例外会突破您应该处理它们的正常流程并释放后变为无关的对象例外。
忘记持有的对象意味着使用不必要的内存,a.k.a。内存泄漏。
正如我之前所说,它需要纪律。
最后,当您需要擦除所有使用的对象时,
noGc.releaseAll();
希望这有帮助。