要尽量使用弱引用。
1. 调用addEventListener方法时,useWeakReference标签使用默认值false。
2. 调用BindingUtils的bindProperty和bindSetter方法时,useWeakReference标签使用默认值false。
请注意:我并不清楚Flex 3中是否也是这样。
3. 调用ChangeWatcher.watch方法,useWeakReference标签使用默认值false。
请注意:我并不清楚Flex 3中是否也是这样。
4. 使用Dictionaries时,构建器把weakKeys标签的值设为false。
第3、4点会创建一些隐性连接,导致内存泄漏
不会造成内存泄漏的情况:
1、使用弱引用
2、自身的监听 如this.addEventListener(Event.Click,onClick);
3、子对象的监听 child.addEventListener(..);
也就是说,以上三种情况不手动removeEventListener也不会造成内存泄漏。当然,推荐是自己remove掉比较好。但是我也觉得这样挺烦的。
会造成内存泄漏的情况:
对父对象的监听会造成内存泄漏,如parent.addEventListener(..);这种情况若不手动remove或使用弱引用肯定会导致内存泄漏。
绑定也会造成内存泄漏
[Bindable]
protected var langPackage:XML = .xx;
<mx:Label x="10" text="{langPackage.roleName}" textAlign="right" width="82" verticalCenter="12"/>
这样的绑定,我经过profile分析,发现若没有将langPackage = null,即使它的父窗口已经关闭了,这个绑定监听依然存在,并导致父窗口的实例无法回收。
按钮的icon图片也会导致内存泄漏
<mx:Button buttonMode="true" icon="@Embed(source='/assets/skin/Default/saveIcon.png')" />
以上button无法被回收。若写成
[Bindable][Embed(source='/assets/skin/Default/saveIcon.png')]
private var saveIcon:Class;
<mx:Button buttonMode="true" icon="{saveIcon}" />
并在移除的时候将saveIcon = null;则可以回收。
当然,这样就很烦了。在flex4中已经不用这样写了。
如果是BindingUtils的绑定。需要unWatch才能释放的
参考资料:
http://www.riameeting.com/node/587
http://www.ibm.com/developerworks/cn/web/1010_wangpeng_flexmem/
强制进行垃圾回收:
try{
(new LocalConnection).connect("mtzg");
(new LocalConnection).connect("mtzg");
}catch(err:Error){ }
FLASH中 连错两次系统就会强制执行垃圾回收机制,从而达到释放一定内存的效果 。
try中那两句语句只是为了让程序出错,错误的参数可以千奇百怪."mtzg"也可以替换为其他字符串。
有争议的地方:内存优化以及弱引用