关于AS3中弱引用的一点理解
来源:互联网 发布:淘宝查号的二维码 编辑:程序博客网 时间:2024/05/01 01:29
载自:http://www.rkuk.org/post/3.html
弱引用英文叫做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对象的这个征听器就不存在了。用简单的代码来证明一下:
weak reference of addEventListener 1
上面的例子留下来了一个问题:如果sp.addEventListerner添加的是强引用,当指向征听器函数的eventHandler设为空后,这个征听器函数仍然不会被gc,那么怎样才能让它被gc掉呢?答案很显然,也就是当sp被gc掉以后,那么这个征听器函数也会被gc掉,因为sp指向的对象中保留了对征听器的唯一强引用。sp怎么才能被gc掉?从AS2走过来的人往往都容易想到removeChild方法。但是AS3中的removeChild方法作用只是把一个DisplayObject对象从Display List中删除,同时也删除Display List中所存在的对这个DisplayObject对象的引用。但是如果这个DisplayObject对象还被其它变量引用时,它就不会被gc。所以说removeChild是必须的,但不足够,还需要删除Display List之外的所有引用才行!当然如果这个DisplayObject不在Display List中的话,就没有必要removeChild。下面也用一个例子说明一下:
weak reference of addEventListener 2
Dictionary的弱引用与addEventListener的原理相同,只不过Dictionary的弱引用指的是对key的弱引用,而不是对value的弱引用。实际上Dictionary对象中保留的是对value的强引用,而且就算value对应的key对象已经被gc了,Dictionary对象中对value的强引用还存在,而且还造成一个不好的影响,就是key被gc后,就无法删除Dictionary对象中对value的强引用。因此我觉得在使用Dictionary对象的时候,如果要删除key的话,应首先delete Dictionary对象中对value的强引用。
weak reference of Dictionary
以上就是个人对弱引用的一点理解。本来想发fla文件上来的,不过安装了代码高亮功能就顺便测试一下。使用了FCKEditor代码高亮插件UGeSHi-GeSHi版,顺便说说这个插件很不错,直接就支持AS3,遗憾的是没有复制代码功能,不过折腾了几天终于给加上去了=)还有就是System.gc不能在release版的fp中使用,着实是个让人郁闷的事,不过从网上搜到有高人已经发现了在release版fp中强制gc的方法了。代码很简单,原理自己去看吧:http://www.actionscript3.cn/magicianzrh/archives/2007/10/zzas3_hack.html
强制gc
- 关于AS3中弱引用的一点理解
- 关于AS3中弱引用的一点理解(转载)
- 关于openlayers中namespace的一点理解
- 关于java中String的一点理解
- 关于java中多线程的一点理解
- C++函数中const引用形参的一点理解
- 对as3中null,undefined,NaN与false的一点理解
- 关于java中软引用的理解
- 对于as3 falsh 和 android java的一点理解
- 关于C#中Thread.Join()的一点理解
- 关于C#中Thread.Join()的一点理解
- 关于Java中static方法的一点理解
- 关于设计模式中创建型模式的一点理解
- Excel中关于自定义单元格内容格式的一点理解
- 关于C#中Thread.Join()的一点理解
- 关于Win32中IO completion port的一点理解
- 关于C#中Thread.Join()的一点理解
- 关于C#中Thread.Join()的一点理解
- 61条面向对象设计的经验
- 李开复畅谈创新工场----收藏
- 程序员的十个升职的好习惯
- vector 与 set区别
- 我对CTO的理解 CTO要有技术魅力
- 关于AS3中弱引用的一点理解
- java解惑笔记
- S60 3rd下如何使用HookLogger查找内存泄漏错误
- ORACLE物化视图-不能删除物化视图的解决办法
- 一个程序员老总的年终总结2009版
- 试试
- oracle书籍
- 用C#实现实现简单的 Ping 的功能,用于测试网络是否已经联通
- Axis1.4