我想知道关于Flash中垃圾收集的Object
类型。
我知道在这种情况下,物品将为垃圾收集做好准备:
// create
var ar:Array = [];
var mc:MovieClip = new MovieClip();
mc.addEventLisntener(blah, blah);
ar.push(mc);
addChild(mc);
// kill & gc
ar.splice(0, 1);
mc.removeEventListener(blah, blah);
removeChild(mc);
但Object
如何/将会在下面的情况下收集垃圾。
假设我在班级MartysMC
中有一个功能,我通过以下方法解析Object
:
package
{
import flash.display.MovieClip;
public class MartysMC extends MovieClip
{
/**
* Updates this
* @param obj An object containing key/value pairs to represent new property values
*/
public function update(obj:Object):void
{
var i:String;
for(i in obj)
{
this[i] = obj[i];
}
}
}
}
现在我像这样使用这个函数:
var mmc:MartysMC = new MartysMC();
var dataObject:Object =
{
x: 10,
y: 34,
alpha: 0.6
};
mmc.update(dataObject);
dataObject
会怎样?这会从这里收集垃圾吗?即使如此,这一行中的对象如何:
mmc.update({x:15,y:18,name:"marty"});
答案 0 :(得分:3)
要查看GC发生了什么,您可以使用Dictionary将弱引用设置为true并使用您想要作为关键字的对象:
var d:Dictionary = new Dictionary(true)
d[myObject] = whatever
当对象不再可用时,它将从字典中删除。
这里有一个基于你在wonderfl的例子的完整示例: http://wonderfl.net/c/e9W4
你很快就会看到你的对象都被垃圾收集了。
答案 1 :(得分:2)
在您的示例中,创建临时对象,传递到函数,由其属性迭代,然后应在下一次GC传递时收集它。没有什么可以把它保存在内存中(虽然GC传递可能不会立即出现,但是还没有办法(但)确实知道这一点。)如果您有疑问,我会添加该属性访问权限({{1} })不创建对临时对象的引用 - 只复制属性(按值复制基本类型,并复制类引用。)