Laya對象池Pool類


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM