弱引用英文叫做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
设置为 true
而不会使它们受垃圾回收的影响。如果对作为嵌套内部函数的侦听器将 useWeakReference
设置为 true
,则该函数将作为垃圾回收并且不再是永久函数。如果创建对该内部函数的引用(将该函数保存到另一个变量中),则该函数将不作为垃圾回收并仍将保持永久。----就是对内部函数有作用。。。
Dictionary的弱引用(使用时,需要 var dic:Dictionary = new Dictionary(false);)与addEventListener的原理相同,只不过Dictionary的弱引用指的是对key的弱引用,而不是对value的弱引用。实际上Dictionary对象中保留的是对value的强引用,而且就算value对应的key对象已经被gc了,Dictionary对象中对value的强引用还存在,而且还造成一个不好的影响,就是key被gc后,就无法删除Dictionary对象中对value的强引用。因此我觉得在使用Dictionary对象的时候,如果要删除key的话,应首先delete Dictionary对象中对value的强引用。
=========================巧用Dictinary弱引用=================================
var dic:Dictionary = new Dictionary(false);
dic[value] = key; // 用value作为键,这样即为用弱引用的形式来存储对象,可以通过 dic[obj] == undefined 来检查某对象是否被回收了。 --- 对象管理器。