一、描述
前面被问到了,心里只有个影子,并不深入。比如:
是什么、区别、应用范围等。
二、解决方法
google、度娘了一大圈才有所明白。
三、原因
由于系统垃圾回收机(gc)制而提出来的。
四、实现
1.是什么:
强引用:也就是我们通常所讲的引用,其存亡直接决定了所指对象的存亡。如果不存在指向一个对象的引用,并且此对象不再显示列表中,则此对象会被从内存中释放。
弱引用:除了不决定对象的存亡外,其他与强引用相同。即使一个对象被持有无数个若引用,只要没有强引用指向他,那么其还是会被清除。
2.应用范围
AS3中常用到弱引用的地方有addEventListener方法和Dictionary类。
-----------------------
addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false)。
其中第5个参数表示是否使用弱引用。
当useWeakReference=false时,EventDispatcher.addEventListener就会在EventDispatcher对象中添加一个对listener这个函数对象的强引用;
当useWeakReference=true时,EventDispatcher.addEventListener方法在EventDispatcher对象中添加的是对listener的弱引用。
-----------------------
//true表示使用弱引用
var dic:Dictionary = new Dictionary(true);
五、效果
private function loadTest():void{
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, loadedHandler, false, 0, true);
loader.loader(new URLRequest( "url" ));
}
private function loadedHandler(evt:Event):void{
( evt.target as Loader ).removeListener(Event.COMPLETE,loadedHandler);
// Do others.
}
这时谁先消亡,谁后消亡?
弱引用不影响到对象的消亡,loader 是个临时变量,此引用是临时的,生存期很短暂,只在 loadTest() 函数内有效 loader 执行完才会被释放,
因为是弱引用,所以也不会执行 loadedHandler();
六、说明
1.此思想来自网络。
2.更多内容可参考:http://www.flashas.net/asbc/20090423/4107.html
4.感谢无私奉献
-------------------------------------------------------------------
本文详细解释了AS3中强引用与弱引用的概念及其区别,包括它们如何影响对象的生命周期,特别是在事件监听器管理和Dictionary类中的应用。通过具体示例说明了弱引用如何帮助避免内存泄漏。

1716

被折叠的 条评论
为什么被折叠?



