SlideShare ist ein Scribd-Unternehmen logo
1 von 13
Downloaden Sie, um offline zu lesen
Flash/ActionScript 3.0 内存管理
     路通展览展示设计(上海)有限公司
                  李正民
                软件工程师
Flash/ActionScript 3内存管理机制

•   数据存储

    1、基元数据类型 (primitive data type) — 值类型
      如:Boolean、int、Number、String和uint
         var _a:int = 10;
         var _b:int = a;
           _b = 9; //改变变量b的值为9
          trace (_a +“ ”+_b); // 10 9


    2、复杂数据类型 (complex data type) — 引用类型
      如:Array、Date、Error、Point、MovieClip等等
          var _array1:Array = new Array(1, 2, 3);
          var _array2:Array = _array1;
          _array2[1] = 4;
          trace(_array1 + "---> " + _array2); // 1 4 3 --> 1 4 3
Flash/ActionScript 3内存管理机制
•   内存释放--Flash Player策略

    1、引用计数( Reference Counting)

      var _a:Object = {Name:"Mike"}; // ref(_a) 1
      var _b:Object = _a; // ref(_a) 2

      delete _a; // ref(_a) 1
      trace(_b.Name); // Mike

      delete _b; // ref(_a) 0
      trace(_b.Name); // undefined


      通过引用计数,可以让 Flash Player决定何时释放一块内存区。
    从这里也可以更好地理解复杂数据类型为引用类型
Flash/ActionScript 3内存管理机制

•   内存释放--Flash Player策略

    引用计数的缺陷 — 两对象互相引用,循环引用

       var _a:Object = {}; // ref(_a) 1
       var _b:Object = {obj:_a}; // ref(_a) 2 ref(_b) 1
       _a.obj= _b; // ref(_b) 2
       delete(_a); // ref(_a) 1
       delete(_b); // ref(_b) 1


      引用计数虽然简单,也很实用,但是并不能解决所有问题。显然
    在上面的实例中,引用计数是无法正常工作,因此 Flash Player的GC
    也就不会去释放相应的内存块。这必然要求 Flash Player有另外的策
    略去清理这些内存块。
Flash/ActionScript 3内存管理机制
•   内存释放--Flash Player策略

    2、标识-清除法(Mark Sweeping)




      可以假设内存中没有被标记的对象不再有任何活动引用,因此可
    以被安全的删除
Flash/ActionScript 3内存管理机制

•   内存释放--Flash Player策略

    优点:非常准确      缺点:CPU占用率高

    Flash Player解决方案:
      a、在满足某个条件的时刻执行
      b、分段执行,不再一次完成整个过程

    上述解决方案导致 Flash Player垃圾回收器操作延期执行,从而引发
    下面一些问题:
     a、对象被删除,但是对象的 Enter_Frame事件还在继续执行
     b、对象被删除,但是对象的声音、视频还在继续播放
     c、对象被删除,但是对象的一个事件,动作还在继续触发 /执行
Flash/ActionScript 3内存管理机制
•   内存释放--编码规则

    1、引用计数归零:注意尽可能地将一些明显的引用计数清零

    2、Actionscript 3 弱引用
      a、事件弱引用
      b、Dictionary弱引用

    addEventListener(type:String,listener:Function,
                     useCapture:Boolean = false,priority:int = 0,
                     useWeakReference:Boolean = false ):void

      通过弱引用,在对象被删除,但未移除事件侦听器时,防止对象
    的事件函数成为永久函数。

    建议:勿忘记 removeEventListener 的调用,设置监听器引用为弱引
       用
Flash/ActionScript 3内存管理机制
•   内存释放--编码规则

    removedFromStage事件:从显示列表中直接删除显示对象或删除包含显示对
    象的子树时调度。故可以侦听这个事件,在这个事件做对象的清理工作。

     this.addEventListener(Event.REMOVED_FROM_STAGE, dispose, false, 0, true);
     var _btn:Sprite = new Sprite();
     _btn.addEventListener(MouseEvent.MOUSE_OVER, btnOver, false, 0, true);
     _btn.buttonMode = true;
     addChild(_btn);

     private function dispose(e:Event):void {
        this.removeEventListener(Event.REMOVED_FROM_STAGE, dispose);
       if(_btn){
           _btn.removeEventListener(MouseEvent.MOUSE_OVER, btnOver);
           _btn.removeEventListener(MouseEvent.CLICK, btnClick);
           removeChild(_btn);
      }
     _btn = null;
     }
Flash/ActionScript 3内存管理机制

•   内存释放--编码规则

    flash.utils .Dictionary 类的使用
    public function Dictionary(weakKeys:Boolean = false)
    指示Dictionary 对象在对象键上使用 “弱”引用

    var _MyObj:Object = new Object();
    var _myDict:Dictionary = new Dictionary(true);
    _myDict[_myObj] = new MovieClip();
    _myObject = null // 移除_myObject


      由于Dictionary 的对象键的弱引用性。故可以将一些复杂的对象
    用作Dictionary 的对象键,来设置复杂对象的弱引用性。
Flash/ActionScript 3内存管理机制

•   内存释放--编码规则

    package com.gskinner.utils {
    import flash.utils.Dictionary;
    public class WeakReference {
          private var dictionary:Dictionary;

             public function WeakReference(p_object:Object) {
                     dictionary = new Dictionary(true);
                     dictionary[p_object] = null;
             }

             public function get():Object {
                      for (var n:Object in dictionary) { return n; }
                      return null;
             }
         }
     }
Flash/ActionScript 3内存管理机制

•   内存释放--编码规则
      public class WeakReference extends Sprite{
       private var _timer:Timer = new Timer(5000, 0);
       private var _sound:Sound = new Sound();
       private var _channel:SoundChannel;
       private var _complete:Boolean = true;
       public function WeakReference() {
            _timer.addEventListener(Timer Event.TIMER, showMemory, false, 0, true);
           _timer.start();
           testSound();
       }
       private function showMemory(evt:TimerEvent = null):void{
            var _date:Date = new Date();
            trace("current time : " + _date.toLocaleString() + " " +
                  System.totalMemory / (1000 * 1000) + "MB");
             _date = null;
           if (true == _complete) testSound();
       }
Flash/ActionScript 3内存管理机制

•   内存释放--编码规则

       private function testSound():void{
                 if(null == _sound) _sound = new Sound();
                 _sound.load(new URLRequest("framer.mp3"));
                 _channel = _sound.play();
                 _channel.addEventListener(Event.SOUND_COMPLETE, complete);
                 _complete = false;
       }
       private function complete(evt:Event = null):void{
                 _channel.removeEventListener(Event.SOUND_COMPLETE, complete);
                 _channel = null;
                 _sound = null;
                 _complete = true;
       }


       Flash Player 9/10 执行结果不一样,在版本 9中会出现内存长
    时间得不到释放,并不停累积,但是最终会释放, 10不会出现这种情
    况。这种情况导致了 Dewar's项目客服端直接死掉。利用 Dictionary
    可以解决这个问题
感谢您的关注!

Weitere ähnliche Inhalte

Was ist angesagt?

分布式系统缓存设计
分布式系统缓存设计分布式系统缓存设计
分布式系统缓存设计aleafs
 
5, initialization & cleanup
5, initialization & cleanup5, initialization & cleanup
5, initialization & cleanupted-xu
 
iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门Lucien Li
 
可用空間的管理
可用空間的管理可用空間的管理
可用空間的管理倩怡 賴
 
Memcached分享
Memcached分享Memcached分享
Memcached分享princehaku
 
Javascript 培训第四节 深入了解
Javascript 培训第四节 深入了解Javascript 培训第四节 深入了解
Javascript 培训第四节 深入了解liziqi7
 
微博实时搜索
微博实时搜索微博实时搜索
微博实时搜索亚军 汪
 

Was ist angesagt? (7)

分布式系统缓存设计
分布式系统缓存设计分布式系统缓存设计
分布式系统缓存设计
 
5, initialization & cleanup
5, initialization & cleanup5, initialization & cleanup
5, initialization & cleanup
 
iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门
 
可用空間的管理
可用空間的管理可用空間的管理
可用空間的管理
 
Memcached分享
Memcached分享Memcached分享
Memcached分享
 
Javascript 培训第四节 深入了解
Javascript 培训第四节 深入了解Javascript 培训第四节 深入了解
Javascript 培训第四节 深入了解
 
微博实时搜索
微博实时搜索微博实时搜索
微博实时搜索
 

Ähnlich wie 详解AS3的内存管理机制,有效释放FLASH内存,减少资源占用

Javascript之昨是今非
Javascript之昨是今非Javascript之昨是今非
Javascript之昨是今非Tony Deng
 
潜力无限的编程语言Javascript
潜力无限的编程语言Javascript潜力无限的编程语言Javascript
潜力无限的编程语言Javascriptjay li
 
jQuery底层架构
jQuery底层架构jQuery底层架构
jQuery底层架构fangdeng
 
Java Script 引擎技术
Java Script 引擎技术Java Script 引擎技术
Java Script 引擎技术bigqiang zou
 
Mybatis学习培训
Mybatis学习培训Mybatis学习培训
Mybatis学习培训flynofry
 
Sun jdk 1.6内存管理 -使用篇
Sun jdk 1.6内存管理 -使用篇Sun jdk 1.6内存管理 -使用篇
Sun jdk 1.6内存管理 -使用篇bluedavy lin
 
10, OCP - flashback
10, OCP - flashback10, OCP - flashback
10, OCP - flashbackted-xu
 
异步编程与浏览器执行模型
异步编程与浏览器执行模型异步编程与浏览器执行模型
异步编程与浏览器执行模型keelii
 
PHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming SkillsPHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming SkillsHo Kim
 
Flex 4.5 action custom component development
Flex 4.5 action custom component developmentFlex 4.5 action custom component development
Flex 4.5 action custom component developmentjexchan
 
Ecma script edition5-小试
Ecma script edition5-小试Ecma script edition5-小试
Ecma script edition5-小试lydiafly
 
Avm2虚拟机浅析与as3性能优化
Avm2虚拟机浅析与as3性能优化Avm2虚拟机浅析与as3性能优化
Avm2虚拟机浅析与as3性能优化Harvey Zhang
 
180518 ntut js and node
180518 ntut js and node180518 ntut js and node
180518 ntut js and nodePeter Yi
 
JavaScript 脚本控件(二)
JavaScript 脚本控件(二)JavaScript 脚本控件(二)
JavaScript 脚本控件(二)RANK LIU
 
網站設計100步
網站設計100步網站設計100步
網站設計100步evercislide
 
Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)Kris Mok
 
學好 node.js 不可不知的事
學好 node.js 不可不知的事學好 node.js 不可不知的事
學好 node.js 不可不知的事Ben Lue
 
A.oracle 查询结果的缓存问题
A.oracle 查询结果的缓存问题A.oracle 查询结果的缓存问题
A.oracle 查询结果的缓存问题WASecurity
 

Ähnlich wie 详解AS3的内存管理机制,有效释放FLASH内存,减少资源占用 (20)

Js培训
Js培训Js培训
Js培训
 
Javascript之昨是今非
Javascript之昨是今非Javascript之昨是今非
Javascript之昨是今非
 
潜力无限的编程语言Javascript
潜力无限的编程语言Javascript潜力无限的编程语言Javascript
潜力无限的编程语言Javascript
 
jQuery底层架构
jQuery底层架构jQuery底层架构
jQuery底层架构
 
Java Script 引擎技术
Java Script 引擎技术Java Script 引擎技术
Java Script 引擎技术
 
Mybatis学习培训
Mybatis学习培训Mybatis学习培训
Mybatis学习培训
 
Sun jdk 1.6内存管理 -使用篇
Sun jdk 1.6内存管理 -使用篇Sun jdk 1.6内存管理 -使用篇
Sun jdk 1.6内存管理 -使用篇
 
10, OCP - flashback
10, OCP - flashback10, OCP - flashback
10, OCP - flashback
 
Sun java
Sun javaSun java
Sun java
 
异步编程与浏览器执行模型
异步编程与浏览器执行模型异步编程与浏览器执行模型
异步编程与浏览器执行模型
 
PHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming SkillsPHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming Skills
 
Flex 4.5 action custom component development
Flex 4.5 action custom component developmentFlex 4.5 action custom component development
Flex 4.5 action custom component development
 
Ecma script edition5-小试
Ecma script edition5-小试Ecma script edition5-小试
Ecma script edition5-小试
 
Avm2虚拟机浅析与as3性能优化
Avm2虚拟机浅析与as3性能优化Avm2虚拟机浅析与as3性能优化
Avm2虚拟机浅析与as3性能优化
 
180518 ntut js and node
180518 ntut js and node180518 ntut js and node
180518 ntut js and node
 
JavaScript 脚本控件(二)
JavaScript 脚本控件(二)JavaScript 脚本控件(二)
JavaScript 脚本控件(二)
 
網站設計100步
網站設計100步網站設計100步
網站設計100步
 
Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)
 
學好 node.js 不可不知的事
學好 node.js 不可不知的事學好 node.js 不可不知的事
學好 node.js 不可不知的事
 
A.oracle 查询结果的缓存问题
A.oracle 查询结果的缓存问题A.oracle 查询结果的缓存问题
A.oracle 查询结果的缓存问题
 

Mehr von FLASH开发者交流会

Introduction to air for android 邱彦林
Introduction to air for android 邱彦林Introduction to air for android 邱彦林
Introduction to air for android 邱彦林FLASH开发者交流会
 
Swf文件格式和abc代码混淆工具 黄珏坤
Swf文件格式和abc代码混淆工具 黄珏坤Swf文件格式和abc代码混淆工具 黄珏坤
Swf文件格式和abc代码混淆工具 黄珏坤FLASH开发者交流会
 
松耦合代码之开发方法与工具演示 刘争辉
松耦合代码之开发方法与工具演示 刘争辉松耦合代码之开发方法与工具演示 刘争辉
松耦合代码之开发方法与工具演示 刘争辉FLASH开发者交流会
 
Flash media server 开发经验谈 沈先彬
Flash media server 开发经验谈 沈先彬Flash media server 开发经验谈 沈先彬
Flash media server 开发经验谈 沈先彬FLASH开发者交流会
 
Flash 独立游戏开发之路 徐黎明
Flash 独立游戏开发之路 徐黎明Flash 独立游戏开发之路 徐黎明
Flash 独立游戏开发之路 徐黎明FLASH开发者交流会
 
程序接口的另类理解与使用 孙毅
程序接口的另类理解与使用 孙毅程序接口的另类理解与使用 孙毅
程序接口的另类理解与使用 孙毅FLASH开发者交流会
 
9月18技术交流会大赛作品介绍 廖湘宁
9月18技术交流会大赛作品介绍 廖湘宁9月18技术交流会大赛作品介绍 廖湘宁
9月18技术交流会大赛作品介绍 廖湘宁FLASH开发者交流会
 
Flash mmorpg游戏引擎及工具开发概述-张明光
Flash mmorpg游戏引擎及工具开发概述-张明光Flash mmorpg游戏引擎及工具开发概述-张明光
Flash mmorpg游戏引擎及工具开发概述-张明光FLASH开发者交流会
 
Flash 游戏应用框架和模块化开发 邱广钦
Flash 游戏应用框架和模块化开发 邱广钦Flash 游戏应用框架和模块化开发 邱广钦
Flash 游戏应用框架和模块化开发 邱广钦FLASH开发者交流会
 
7月24日交流会麻球演讲 廖湘宁
7月24日交流会麻球演讲 廖湘宁7月24日交流会麻球演讲 廖湘宁
7月24日交流会麻球演讲 廖湘宁FLASH开发者交流会
 
轻量级Flash服务器开发框架(刘恒)
轻量级Flash服务器开发框架(刘恒)轻量级Flash服务器开发框架(刘恒)
轻量级Flash服务器开发框架(刘恒)FLASH开发者交流会
 

Mehr von FLASH开发者交流会 (20)

Bambook sdk 与action script
Bambook  sdk  与action scriptBambook  sdk  与action script
Bambook sdk 与action script
 
Bambook开放之路
Bambook开放之路Bambook开放之路
Bambook开放之路
 
Introduction to air for android 邱彦林
Introduction to air for android 邱彦林Introduction to air for android 邱彦林
Introduction to air for android 邱彦林
 
Misato engine hugh_tsai-蔡浩宇
Misato engine hugh_tsai-蔡浩宇Misato engine hugh_tsai-蔡浩宇
Misato engine hugh_tsai-蔡浩宇
 
Swf文件格式和abc代码混淆工具 黄珏坤
Swf文件格式和abc代码混淆工具 黄珏坤Swf文件格式和abc代码混淆工具 黄珏坤
Swf文件格式和abc代码混淆工具 黄珏坤
 
松耦合代码之开发方法与工具演示 刘争辉
松耦合代码之开发方法与工具演示 刘争辉松耦合代码之开发方法与工具演示 刘争辉
松耦合代码之开发方法与工具演示 刘争辉
 
Flash media server 开发经验谈 沈先彬
Flash media server 开发经验谈 沈先彬Flash media server 开发经验谈 沈先彬
Flash media server 开发经验谈 沈先彬
 
Flash 独立游戏开发之路 徐黎明
Flash 独立游戏开发之路 徐黎明Flash 独立游戏开发之路 徐黎明
Flash 独立游戏开发之路 徐黎明
 
程序接口的另类理解与使用 孙毅
程序接口的另类理解与使用 孙毅程序接口的另类理解与使用 孙毅
程序接口的另类理解与使用 孙毅
 
Flash游戏大会 商文烨
Flash游戏大会 商文烨Flash游戏大会 商文烨
Flash游戏大会 商文烨
 
Flash ria usability 刘轩飞
Flash ria usability 刘轩飞Flash ria usability 刘轩飞
Flash ria usability 刘轩飞
 
9月18技术交流会大赛作品介绍 廖湘宁
9月18技术交流会大赛作品介绍 廖湘宁9月18技术交流会大赛作品介绍 廖湘宁
9月18技术交流会大赛作品介绍 廖湘宁
 
简化复杂的Flash应用程序 谈熠
简化复杂的Flash应用程序 谈熠简化复杂的Flash应用程序 谈熠
简化复杂的Flash应用程序 谈熠
 
Flash mmorpg游戏引擎及工具开发概述-张明光
Flash mmorpg游戏引擎及工具开发概述-张明光Flash mmorpg游戏引擎及工具开发概述-张明光
Flash mmorpg游戏引擎及工具开发概述-张明光
 
Web base 吴志华
Web base 吴志华Web base 吴志华
Web base 吴志华
 
Flash 游戏应用框架和模块化开发 邱广钦
Flash 游戏应用框架和模块化开发 邱广钦Flash 游戏应用框架和模块化开发 邱广钦
Flash 游戏应用框架和模块化开发 邱广钦
 
7月24日交流会麻球演讲 廖湘宁
7月24日交流会麻球演讲 廖湘宁7月24日交流会麻球演讲 廖湘宁
7月24日交流会麻球演讲 廖湘宁
 
浅析Flash特效开发 陈勇
浅析Flash特效开发 陈勇浅析Flash特效开发 陈勇
浅析Flash特效开发 陈勇
 
Flash网络通讯处理 陈苏俊
Flash网络通讯处理 陈苏俊Flash网络通讯处理 陈苏俊
Flash网络通讯处理 陈苏俊
 
轻量级Flash服务器开发框架(刘恒)
轻量级Flash服务器开发框架(刘恒)轻量级Flash服务器开发框架(刘恒)
轻量级Flash服务器开发框架(刘恒)
 

详解AS3的内存管理机制,有效释放FLASH内存,减少资源占用

  • 1. Flash/ActionScript 3.0 内存管理 路通展览展示设计(上海)有限公司 李正民 软件工程师
  • 2. Flash/ActionScript 3内存管理机制 • 数据存储 1、基元数据类型 (primitive data type) — 值类型 如:Boolean、int、Number、String和uint var _a:int = 10; var _b:int = a; _b = 9; //改变变量b的值为9 trace (_a +“ ”+_b); // 10 9 2、复杂数据类型 (complex data type) — 引用类型 如:Array、Date、Error、Point、MovieClip等等 var _array1:Array = new Array(1, 2, 3); var _array2:Array = _array1; _array2[1] = 4; trace(_array1 + "---> " + _array2); // 1 4 3 --> 1 4 3
  • 3. Flash/ActionScript 3内存管理机制 • 内存释放--Flash Player策略 1、引用计数( Reference Counting) var _a:Object = {Name:"Mike"}; // ref(_a) 1 var _b:Object = _a; // ref(_a) 2 delete _a; // ref(_a) 1 trace(_b.Name); // Mike delete _b; // ref(_a) 0 trace(_b.Name); // undefined 通过引用计数,可以让 Flash Player决定何时释放一块内存区。 从这里也可以更好地理解复杂数据类型为引用类型
  • 4. Flash/ActionScript 3内存管理机制 • 内存释放--Flash Player策略 引用计数的缺陷 — 两对象互相引用,循环引用 var _a:Object = {}; // ref(_a) 1    var _b:Object = {obj:_a}; // ref(_a) 2 ref(_b) 1    _a.obj= _b; // ref(_b) 2    delete(_a); // ref(_a) 1    delete(_b); // ref(_b) 1 引用计数虽然简单,也很实用,但是并不能解决所有问题。显然 在上面的实例中,引用计数是无法正常工作,因此 Flash Player的GC 也就不会去释放相应的内存块。这必然要求 Flash Player有另外的策 略去清理这些内存块。
  • 5. Flash/ActionScript 3内存管理机制 • 内存释放--Flash Player策略 2、标识-清除法(Mark Sweeping) 可以假设内存中没有被标记的对象不再有任何活动引用,因此可 以被安全的删除
  • 6. Flash/ActionScript 3内存管理机制 • 内存释放--Flash Player策略 优点:非常准确 缺点:CPU占用率高 Flash Player解决方案: a、在满足某个条件的时刻执行 b、分段执行,不再一次完成整个过程 上述解决方案导致 Flash Player垃圾回收器操作延期执行,从而引发 下面一些问题: a、对象被删除,但是对象的 Enter_Frame事件还在继续执行 b、对象被删除,但是对象的声音、视频还在继续播放 c、对象被删除,但是对象的一个事件,动作还在继续触发 /执行
  • 7. Flash/ActionScript 3内存管理机制 • 内存释放--编码规则 1、引用计数归零:注意尽可能地将一些明显的引用计数清零 2、Actionscript 3 弱引用 a、事件弱引用 b、Dictionary弱引用 addEventListener(type:String,listener:Function, useCapture:Boolean = false,priority:int = 0, useWeakReference:Boolean = false ):void 通过弱引用,在对象被删除,但未移除事件侦听器时,防止对象 的事件函数成为永久函数。 建议:勿忘记 removeEventListener 的调用,设置监听器引用为弱引 用
  • 8. Flash/ActionScript 3内存管理机制 • 内存释放--编码规则 removedFromStage事件:从显示列表中直接删除显示对象或删除包含显示对 象的子树时调度。故可以侦听这个事件,在这个事件做对象的清理工作。 this.addEventListener(Event.REMOVED_FROM_STAGE, dispose, false, 0, true); var _btn:Sprite = new Sprite(); _btn.addEventListener(MouseEvent.MOUSE_OVER, btnOver, false, 0, true); _btn.buttonMode = true; addChild(_btn); private function dispose(e:Event):void { this.removeEventListener(Event.REMOVED_FROM_STAGE, dispose); if(_btn){ _btn.removeEventListener(MouseEvent.MOUSE_OVER, btnOver); _btn.removeEventListener(MouseEvent.CLICK, btnClick); removeChild(_btn); } _btn = null; }
  • 9. Flash/ActionScript 3内存管理机制 • 内存释放--编码规则 flash.utils .Dictionary 类的使用 public function Dictionary(weakKeys:Boolean = false) 指示Dictionary 对象在对象键上使用 “弱”引用 var _MyObj:Object = new Object(); var _myDict:Dictionary = new Dictionary(true); _myDict[_myObj] = new MovieClip(); _myObject = null // 移除_myObject 由于Dictionary 的对象键的弱引用性。故可以将一些复杂的对象 用作Dictionary 的对象键,来设置复杂对象的弱引用性。
  • 10. Flash/ActionScript 3内存管理机制 • 内存释放--编码规则 package com.gskinner.utils { import flash.utils.Dictionary; public class WeakReference { private var dictionary:Dictionary; public function WeakReference(p_object:Object) { dictionary = new Dictionary(true); dictionary[p_object] = null; } public function get():Object { for (var n:Object in dictionary) { return n; } return null; } } }
  • 11. Flash/ActionScript 3内存管理机制 • 内存释放--编码规则 public class WeakReference extends Sprite{ private var _timer:Timer = new Timer(5000, 0); private var _sound:Sound = new Sound(); private var _channel:SoundChannel; private var _complete:Boolean = true; public function WeakReference() { _timer.addEventListener(Timer Event.TIMER, showMemory, false, 0, true); _timer.start(); testSound(); } private function showMemory(evt:TimerEvent = null):void{ var _date:Date = new Date(); trace("current time : " + _date.toLocaleString() + " " + System.totalMemory / (1000 * 1000) + "MB"); _date = null; if (true == _complete) testSound(); }
  • 12. Flash/ActionScript 3内存管理机制 • 内存释放--编码规则 private function testSound():void{ if(null == _sound) _sound = new Sound(); _sound.load(new URLRequest("framer.mp3")); _channel = _sound.play(); _channel.addEventListener(Event.SOUND_COMPLETE, complete); _complete = false; } private function complete(evt:Event = null):void{ _channel.removeEventListener(Event.SOUND_COMPLETE, complete); _channel = null; _sound = null; _complete = true; } Flash Player 9/10 执行结果不一样,在版本 9中会出现内存长 时间得不到释放,并不停累积,但是最终会释放, 10不会出现这种情 况。这种情况导致了 Dewar's项目客服端直接死掉。利用 Dictionary 可以解决这个问题