弱引用从原则上来讲,是为了防止无意识的对象保留引起的内存泄露!
在ActionScript中的强弱引用往往是指在使用Dictionary类时和侦听器和事件中。
一、Dictionary类
Dictionary 类是用于创建属性的动态集合,该集合使用全等运算符 (
===
) 进行键比较。将对象用作键时,会使用对象的标识来查找对象,而不是使用在对象上调用toString()
所返回的值。在Dictionary类的构造方法中有:
public fuction Dictionary(weakKeys:Boolean = false){}
其中参数weakKeys:Boolean(default = false)指的是创建的该对象是否为弱引用类型,如果是则键符合垃圾回收的条件,并且在回收对象时会被从表中删除。如果不是则垃圾回收机制不会自行处理,则通过人为的方式处理!
二、侦听器中的弱引用
在使用ActionScript2开发时经常用完事件后就忘了移除侦听器对象,这将消耗系统的资源,也是我们最常见的诡异的bug种类之一。
若侦听器设置为弱引用,而且在程序运行时只剩下了这个弱引用指向侦听器,这是垃圾回收机器可以不理它,直接就把侦听器回收了。
三、事件中的弱引用
我在设置添加侦听器时如下:
this.addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false):其中第五个参数useWeakReference即可以指定对侦听器的引用是强引用还是弱引用,强引用可防止侦听器被当作垃圾回收,弱引用没有此作用(也就是说垃圾回收机制会处理弱引用的对象)。如果所使用的侦听器在其他地方没有被引用,只剩下addEventListener()为他注册的弱引用时,该侦听器就会被当作垃圾,在下一次垃圾回收机制工作周其中回收掉,从而节省资源!
*注意提示
由于垃圾回收机制工作不是即时的,有周期性的延迟,所以我们一般不应当依赖于弱引用属性来移除侦听器,在销毁之前这个侦听器还会继续存在、继续作用。所以,一般情况下当我们使用完侦听器后,就直接调用removeEventListener()方法移除侦听器!