|
   
- 精华
- 4
- 积分
- 3864
- 威望
- 130 点
- 银子
- 1135 两
- 金子
- 62 两
- 来自
- M75星云
 
|
9RIA天地会官方培训机构
Adobe官方认证培训中心
最近貌似大家很喜欢“内存回收”这东西
老实说,这东西不管也罢…它有机会就会回收的,强制内存回收也是用来玩玩而已
但是,有一个和内存回收无关的东西--程序设计上导致的内存占用不断上升,这点是靠我们经验来解决,而不是靠那个所谓的内存回收机制。
如果你觉得这文很长,直接看后面…
怎么样编写内存占用少的AS3程序?我经验不足怎么办?
正所谓的,看代码,就是和其他程序员的心灵的交流,所以下面我就无耻地请出我们的代码了。
请大家定位到Flex3InstallRoot\sdks\3.0.0\frameworks\projects\framework\src\mx\managers\PopUpManagerImpl.as中,看看人家究竟是怎么个设计。
大家请先看
public function addPopUp 这个函数
里面一对代码都是关于如何在PopupManager中创建一个弹出窗口的代码,其中有一点很值得重视…
- // Listen for unload so we know to kill the window (and the modalWindow if modal)
- // this handles _all_ cleanup
- window.addEventListener(Event.REMOVED, popupRemovedHandler);
复制代码
就是在这里,PopupManager给添加了个Remove事件的监听器。
跟着,如果我们要去除这个PopUp的时候是调用RemovePopup的,我们看看这个函数是怎么写的:
- public function removePopUp(popUp:IFlexDisplayObject):void
- {
- // all we want to do here is verify that this popup is one of ours
- // and remove it from the display list; the REMOVED handler will do the rest
- // (this is so that we never leak memory, popups will self-manage even if
- // removePopUp is not called).
- if (popUp && popUp.parent)
- {
- const o:PopUpData = findPopupInfoByOwner(popUp);
- if (o)
- {
- const sm:ISystemManager = ISystemManager(popUp.parent);
-
- if (o.topMost)
- sm.popUpChildren.removeChild(DisplayObject(popUp));
- else
- sm.removeChild(DisplayObject(popUp));
- }
- }
- }
复制代码
看见开发人员自己写的注释没?他意思是说,当执行removeChild的时候,remove时间会自动触发,来给他们做剩下的清理工作。
跟着我们看看popupRemovedHandler
毫无疑问,它对里面的对象做了一些清理工作,具体就看代码吧......
这个类告诉我们一个很明显的道理:
任何一个DisplayObject被移除的时候都会发出Remove事件,我们只要对这个remove事件进行监听,再进行相关的清理工作就可以了。
猫粮是不是很找抽,这么浅显的道理讲了这么久..
当然,说到具体如何设计的话,我觉得是Case By Case的,如果需要进一步的详细,跟帖吧...(懒得说了)
Ps:最近有幸地闲了点,哈哈…
[ 本帖最后由 猫粮 于 2007-10-28 11:00 编辑 ] |
|