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