一、回收
1.once参数,默认是自动回收到池子里的。手动回收可以调用recover
/**
* 从对象池内创建一个Handler,默认会执行一次并立即回收
*,如果不需要自动回收,设置once参数为false。
* @param caller 执行域(this)。
* @param method 回调方法。
* @param args 携带的参数。
* @param once 是否只执行一次,如果为true,回调后执行recover()进行回收,默认为true。
* @return 返回创建的handler实例。
*/
public static function create(caller:*, method:Function,
args:Array = null, once:Boolean = true):Handler {
if (_pool.length) return _pool.pop().setTo(caller, method, args, once);
return new Handler(caller, method, args, once);
}
/**
* 清理并回收到 Handler 对象池内。
*/
public function recover():void {
if (_id > 0) {
_id = 0;
_pool.push(clear());
}
}
//手动回收示例,要先recover再置为null
if (allCompHandler) {
allCompHandler.recover();
allCompHandler = null;
}
注意:打开面板时,如果传入的参数内有Handler,需要在关闭时清理。否则下次再打开面板,会重新传入新的参数,之前参数的Handler就找不到了……
2.Handler的caller出现错误
这种情况一般是handler被回收了,但又去使用它。可是它已经在池子里被重新分配给别的类去使用了,就导致在debug面板中,看到caller变成别的类对象了。一般是先去检查once参数设置和有没有主动调用recover方法。如果没有,再去考虑整个类对象是否存在内存泄露,导致非正常回收。
二、作用域
node.on(Event.CLICK, null, resizeHandler, [node]);
注意作用域为null时resizeHandler方法取不到本类中的变量
三、参数叠加
如果一个动画播放过程中抛的事件带参数,那我们额外追加的参数要放在其前面
1.不带额外参数:
Handler.create(this, eventHandler)
private function eventHandler(event : String) : void {
trace("event",event);
}
2.带额外参数:
Handler.create(this, eventHandler,["test"])
private function eventHandler(test:String,event : String) : void {
trace("event",event,"test",test);
}