對象池可以用於優化代碼,提高代碼效率。
這裏我提供了一種簡單的技巧。
查閱一下代碼,把函數內的、函數開頭的所有定義引用變量+new對象的代碼找到,然後從對象池中pop出來,再在函數結尾中把對象再push進去。
如果是隻有函數內的一段代碼用到,比如一個循環裏邊的變量,那就可以在循環裏邊用這個,在結尾處把對象push進去。
把代碼中修改的所有的new對象,都在對象池的構造器中直接new一遍然後放入對象池中。其實這件事情不做也可以。
以下貼上一個網上找的AS3的對象池(http://www.cnblogs.com/AS30/archive/2011/09/28/2194611.html):
package
{
import
flash.utils.Dictionary;
import
flash.utils.getDefinitionByName;
import
flash.utils.getQualifiedClassName;
/**
* 用於顯示對象的對象池類
* @author yanghongbin
*
*/
public
class
DisplayObjectPool
{
private
static
var
instance:DisplayObjectPool;
/**
* 作爲對象池的詞典dict
*/
private
var
objPoolDict:Dictionary =
new
Dictionary();
public
function
DisplayObjectPool()
{
}
public
static
function
getInstance():DisplayObjectPool
{
if
(instance ==
null
)
{
instance =
new
DisplayObjectPool();
}
return
instance;
}
/**
* 向對象池中放入對象,以便重複利用
* @param disObj 要的放入對象
*
*/
public
function
push(oldObj:
Object
):
void
{
var
objName:
String
= getQualifiedClassName(oldObj);
if
(oldObj ==
null
)
{
return
;
}
if
(
this
.objPoolDict[objName] ==
null
)
{
this
.objPoolDict[objName] = [];
}
this
.objPoolDict[objName].push(oldObj);
}
/**
* 從對象池中取出需要的對象
* @param targetObj 需要的對象類類名,沒必要必須是類實例名 類名就可以
* @return 取出的相應對象
*
*/
public
function
pop(targetObj:
Object
):
Object
{
var
objName:
String
= getQualifiedClassName(targetObj);
trace
(objName);
if
(
this
.objPoolDict[objName] !=
null
&&
this
.objPoolDict[objName].length >
0
)
{
return
this
.objPoolDict[objName].pop()
as
Object
;
}
var
objClass:Class = getDefinitionByName(objName)
as
Class;
var
obj:
Object
=
new
objClass
as
Object
;
return
obj;
}
}
}