Laya底层学习
一、Pool类(Laya封装的对象池):
Pool类
的存储方式是:键值对(即josn),值是个数组,键是存储对象的类名。
添加键值的方法:recover(sign:string, item:Object)
sign:类名、item:类的内容,该方法通过getPoolBySign(sign:string):Array
来获取对应的键值(如果没有传进来的类名值时,会创建键和返回一个空数组),调用getPoolBySign(sign:string)
会返回数组在recover(sign:string, item:Object)
方法中push进去。
/**
* 根据对象类型标识字符,获取对象池。
* @param sign 对象类型标识字符。
* @return 对象池。
*/
public static function getPoolBySign(sign:String):Array {
return _poolDic[sign] || (_poolDic[sign] = []);
}
/**
* 将对象放到对应类型标识的对象池中。
* @param sign 对象类型标识字符。
* @param item 对象。
*/
public static function recover(sign:String, item:Object):void {
/*[IF-FLASH]*/
if (_inPoolDic[item]) return;
/*[IF-FLASH]*/
_inPoolDic[item] = true;
//[IF-JS]if (item[InPoolSign]) return;
//[IF-JS]item[InPoolSign] = true;
getPoolBySign(sign).push(item); //H5调用
}
调用对象池中已有的对象的方法:getItemByClass(sign:String, cls:Class):*
、getItemByCreateFun(sign:String, createFun:Function):*
和getItem(sign:String):*
。
3个方法的共同点:
有对象的空闲对象时,移除数组最后一个,并且会返回移除的对象。
3个方法的不同点:
getItemByClass(sign:String, cls:Class):*
:当没有空闲对象时,会根据传入的类而创建一个新类作为返回值。
getItemByCreateFun(sign:String, createFun:Function):*
:当没有空闲对象时,会根据传入的Function
而返回该Function
的返回值。
getItem(sign:String):*
:当没有空闲对象时直接返回null
。
/**
* <p>根据传入的对象类型标识字符,获取对象池中此类型标识的一个对象实例。</p>
* <p>当对象池中无此类型标识的对象时,则根据传入的类型,创建一个新的对象返回。</p>
* @param sign 对象类型标识字符。
* @param cls 用于创建该类型对象的类。
* @return 此类型标识的一个对象。
*/
public static function getItemByClass(sign:String, cls:Class):* {
var pool:Array = getPoolBySign(sign);
var rst:Object = pool.length ? pool.pop() : new cls();
/*[IF-FLASH]*/
delete _inPoolDic[rst];
//[IF-JS]rst[InPoolSign] = false;
return rst;
}
/**
* <p>根据传入的对象类型标识字符,获取对象池中此类型标识的一个对象实例。</p>
* <p>当对象池中无此类型标识的对象时,则使用传入的创建此类型对象的函数,新建一个对象返回。</p>
* @param sign 对象类型标识字符。
* @param createFun 用于创建该类型对象的方法。
* @return 此类型标识的一个对象。
*/
public static function getItemByCreateFun(sign:String, createFun:Function):* {
var pool:Array = getPoolBySign(sign);
var rst:Object = pool.length ? pool.pop() : createFun();
/*[IF-FLASH]*/
delete _inPoolDic[rst];
//[IF-JS]rst[InPoolSign] = false;
return rst;
}
/**
* 根据传入的对象类型标识字符,获取对象池中已存储的此类型的一个对象,如果对象池中无此类型的对象,则返回 null 。
* @param sign 对象类型标识字符。
* @return 对象池中此类型的一个对象,如果对象池中无此类型的对象,则返回 null 。
*/
public static function getItem(sign:String):* {
var pool:Array = getPoolBySign(sign);
var rst:Object = pool.length ? pool.pop() : null;
if (rst) {
/*[IF-FLASH]*/
delete _inPoolDic[rst];
//[IF-JS]rst[InPoolSign] = false;
}
return rst;
}
Pool
只能清除某个键中所有存放着的对象。方法是:clearBySign(sign:String):void
。
/**
* 清除对象池的对象。
* @param sign 对象类型标识字符。
*/
public static function clearBySign(sign:String):void {
if (_poolDic[sign]) _poolDic[sign].length = 0;
}