Flash务实主义(五)——AS3的垃圾回收

前端开发 作者: 2024-08-20 09:10:01
GC和内存泄露无关 垃圾回收,这次是一个被无数人讨论过的传统话题。 Action Script使用的是和Java相似的内存管理机制,并不会即时回收废弃对象的内存,而是在特定时间统一执行一次GC(Gabage Collection)操作来释放废弃对象的内存,避免了重复判断是否需要回收产生的性能问题。 但要注意,这只是决定回收的时机,而不是回收的内容。这个延迟执行内存回收也就是个表面的现象,不管什么时
try {
    new LocalConnection ().connect ( "gc" );
    new LocalConnection ().connect ( "gc" );
} catch ( e:Error ) {}
  • 属性的相互引用是很明确的,一般都是一个对象包含着若干属性,那么这个对象自然可以维持它的属性的引用。如果这个类不会被回收(能够被根 访问),他的所有属性也都不会被回收。同样的,如果这个类可以被回收的话(不能被根访问),也就不会妨碍属性的回收。所以你并不需要将所有属性设置为 null,除非你希望在对象存在时候就回收其属性的内存,这种需求基本不存在。
  • 静态属性是一个特殊的情况。静态属性本身就是根,所以你必须将其设置null才有可能被回收,没有别的办法。
  • 至于在显示列表中的对象。既然根(stage)可以用getChildAt访问到自己的所有子对象,那么只要你在显示列表中,就肯定不会 被回收。然而,如果显示对象的父层对象已经不再显示列表内,它的子对象就算还在父层对象之中也没有关系,因为它已经不能被stage访问到了。所以你不需 要removeChild各层的全部对象,而只需要removeChild最高一层的父对象即可。
  • A.addEventListener(“event”,B.handler),像这样添加过事件后,你可以认为B.handler成为 了A的一个属性(因为A在需要的时候要能调用B.handler),这里也符合属性相互引用的原则。但是事件判断起来的确要比属性麻烦,因为相互引用的情 况很多。在这里可以分为三种情况:
    1. 对自己监听自己的事件,这相当于用自己的属性保存自己引用,任何情况都不会阻碍自己被回收。
    2. 对自己的子对象(属性或者child)监听自己的事件。因为子对象本来就是自己在维持它的引用,那么即使它们会维持你的引用,也 只会形成一个循环。一旦你和stage脱离了联系,子对象同样也会脱离联系,当然也无法妨碍你自己被回收了。除非子对象因为一些原因可以单独维持引用(诸 如被保存在静态属性中),但这种情况很少见。
    3. 对自己的父对象(parent或者stage)监听自己的事件。因为这使得你成为了父对象的一个属性,只要parent或者 stage不被回收,那么自己就不会被回收。尤其是stage,它肯定不会被回收。这种情况一般都会导致自己无法回收,是必须 removeEventListener的。
  • 一处是addEventListener的第5个属性,名为userWeakReference,设置为true,监听事件将不会影响对象回收。
  • 一处是Dictionary的构造函数参数,名为weakKeys,设置为true,当键为复杂对象时,即使Dictionary存在,键依然可以被回收。注意,这里说的是键,不是值,值是不享受弱引用待遇的。这个属性也写得也很明白,是weakKeys。
原创声明
本站部分文章基于互联网的整理,我们会把真正“有用/优质”的文章整理提供给各位开发者。本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
本文链接:http://www.jiecseo.com/news/show_65433.html
flash 务实 主义 as3 3 垃圾 回收