弱引用英文叫做weak reference,与之相反的是强引用(strong reference)。引用不是对象本身,而是类似于指向对象的一个指针。通常都说当至少还存在一个引用指向某个对象的时候,这个对象就不会被gc,这里所说的引用就是强引用,而不是弱引用。反过来说,即使有N多弱引用指向某个对象,而没有一个强引用指向该对象时,这个对象也会被gc,当gc发生后,所有的弱引用指向的对象就不存在了。这就是强引用与弱引用的本质区别。
AS3中常用到弱引用的地方有addEventListener方法和Dictionary类。
addEventListener方法的参数表为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的弱引用,此时如果这个listener函数对象只是作为EventDispatcher对象的征听器被引用时,那么gc执行时就会回收这个listener函数,从而EventDispatcher对象的这个征听器就不存在了。
Dictionary的弱引用与addEventListener的原理相同,只不过Dictionary的弱引用指的是对key的弱引用,而不是对value的弱引用。实际上Dictionary对象中保留的是对value的强引用,而且就算value对应的key对象已经被gc了,Dictionary对象中对value的强引用还存在,而且还造成一个不好的影响,就是key被gc后,就无法删除Dictionary对象中对value的强引用。因此我觉得在使用Dictionary对象的时候,如果要删除key的话,应首先delete Dictionary对象中对value的强引用。
原文:http://www.cnblogs.com/maomaolw3/p/4368374.html