This blog (和其他人)指出,在清理对象时,应该在dispose()方法中将对象引用设置为null。
但是,ActionScript3(带有Flash Player 9)使用mark and sweep为您清除循环引用。所以我想知道:真的有什么理由让你的对象引用为空吗?
发布于 2011-05-04 10:07:33
我从来不这样做--只要你做明显的事情:
则对象所使用的内存随时可用于覆盖。
var ar:Array = [];
var mc:MovieClip = new MovieClip();
mc.addEventListener(MouseEvent.CLICK, pants);
ar[ar.length] = mc;
addChild(mc);
if(mc.parent) mc.parent.removeChild(mc); // not garbage collected
mc.removeEventListener(MouseEvent.CLICK, pants); // still not garbage collected
ar.splice(0, 1); // finally garbage collected发布于 2011-05-04 11:07:07
Grant Skinner演示文稿是对内存管理的一个精彩总结:
http://gskinner.com/talks/resource-management/
总而言之,我从不null对象本身,而是将引用它们的对象设为空(有一个细微但重要的区别)。所有对对象的引用都需要销毁,事件侦听器等也需要销毁。
添加事件侦听器时,要养成将侦听器设置为weak的习惯。
o.addEventListener(MouseEvent.CLICK, onClick, false, 0, true);
这没有缺点,这意味着如果您将所有对对象o的引用设为空,但仍然附加了侦听器,它们将自行删除,并且对象仍然可以被标记为gc‘’ed。尽管如此,您仍然应该处理您自己的侦听器的删除。
“不要偷懒--把自己清理干净!”
最后,您可以使用看门人类来帮助监视/清理您的资源:
http://gskinner.com/libraries/
https://stackoverflow.com/questions/5877674
复制相似问题