9RIA.com天地会 - 论坛

返回列表 发帖

天地培训

9RIA天地会官方培训机构

Adobe官方认证培训中心

[心得] 轻松几行让你AS3程序不再“内存泄露”

最近貌似大家很喜欢“内存回收”这东西
老实说,这东西不管也罢…它有机会就会回收的,强制内存回收也是用来玩玩而已
但是,有一个和内存回收无关的东西--程序设计上导致的内存占用不断上升,这点是靠我们经验来解决,而不是靠那个所谓的内存回收机制。
如果你觉得这文很长,直接看后面…

怎么样编写内存占用少的AS3程序?我经验不足怎么办?
正所谓的,看代码,就是和其他程序员的心灵的交流,所以下面我就无耻地请出我们的代码了。


请大家定位到Flex3InstallRoot\sdks\3.0.0\frameworks\projects\framework\src\mx\managers\PopUpManagerImpl.as中,看看人家究竟是怎么个设计。

大家请先看
public function addPopUp 这个函数
里面一对代码都是关于如何在PopupManager中创建一个弹出窗口的代码,其中有一点很值得重视…
  1.       // Listen for unload so we know to kill the window (and the modalWindow if modal)
  2.         // this handles _all_ cleanup
  3.         window.addEventListener(Event.REMOVED, popupRemovedHandler);
复制代码

就是在这里,PopupManager给添加了个Remove事件的监听器。

跟着,如果我们要去除这个PopUp的时候是调用RemovePopup的,我们看看这个函数是怎么写的:
  1.     public function removePopUp(popUp:IFlexDisplayObject):void
  2.     {
  3.         // all we want to do here is verify that this popup is one of ours
  4.         // and remove it from the display list; the REMOVED handler will do the rest
  5.         // (this is so that we never leak memory, popups will self-manage even if
  6.         //  removePopUp is not called).
  7.         if (popUp && popUp.parent)
  8.         {
  9.             const o:PopUpData = findPopupInfoByOwner(popUp);
  10.             if (o)
  11.             {
  12.                 const sm:ISystemManager = ISystemManager(popUp.parent);
  13.                
  14.                 if (o.topMost)
  15.                     sm.popUpChildren.removeChild(DisplayObject(popUp));
  16.                 else
  17.                     sm.removeChild(DisplayObject(popUp));
  18.             }
  19.         }
  20.     }
复制代码

看见开发人员自己写的注释没?他意思是说,当执行removeChild的时候,remove时间会自动触发,来给他们做剩下的清理工作。
跟着我们看看popupRemovedHandler
毫无疑问,它对里面的对象做了一些清理工作,具体就看代码吧......

这个类告诉我们一个很明显的道理:

任何一个DisplayObject被移除的时候都会发出Remove事件,我们只要对这个remove事件进行监听,再进行相关的清理工作就可以了。

猫粮是不是很找抽,这么浅显的道理讲了这么久..
当然,说到具体如何设计的话,我觉得是Case By Case的,如果需要进一步的详细,跟帖吧...(懒得说了)
Ps:最近有幸地闲了点,哈哈…

[ 本帖最后由 猫粮 于 2007-10-28 11:00 编辑 ]
哥们,行行好别拜我了,我还没死

天地人才库
狂亲一个。。。
可惜我不是猫。。。

楼主这么一说,给我解了一个心结了。。。。

不过,要看懂,还真不是一件易事。。。努力中。。。

[ 本帖最后由 Password 于 2007-10-28 22:32 编辑 ]

TOP

哈哈!好发现!

TOP

好兄弟,讲义气!---by eko

踏上天地会荣耀之路!

 

申请舵主

加入掘金队

加入译林军

知识专题整理

 

咨询(QQ):

1442604479(小地)

 

是个好习惯......

但我在想它这里是不是还需要再加个

window.removeEventListener(Event.REMOVED, popupRemovedHandler);呢?...

杀人就该杀全家~!
宫心计!富贵门!

TOP

杀人就该杀全家

这句不错,可是别的按钮可是东西也可能用到这个东西,所以还是要想好要不要杀,呵呵

TOP

学习,呵呵
不过要先把一些基本的东西先搞清才行

TOP

ding
看贴不回贴就是没公德!兄弟~~,做人要厚道!

TOP

好帖先顶一下
现在正在学习AS3

TOP

赞!正找这个问题的解决方法呢
走我的路,为你们喝彩!

TOP

没看懂 :-120)

TOP

明显不能清除你自己加的 Event.REMOVED
如果也清除这个 Event.REMOVED
当你再次把他add进去的时候 那些本来该有事件就都没有了
而当对象还在监听 Event.REMOVED 的时候 明显是不会被回收的
所以这个方法本质上一点用都没有
如果你的显示对象都是一次性的倒可以用用

TOP

提示: 作者被禁止或删除 内容自动屏蔽

TOP

.....IFlexDisplayObject,这个是AS3官方的接口么

TOP

学习中!

TOP

很关心这个问题,单境界不够,还是要多多学习~~~

TOP

返回列表