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;
}