首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

轻巧几行让你AS3程序不再“内存泄露”

2012-11-10 
轻松几行让你AS3程序不再“内存泄露”请大家定位到Flex3InstallRoot\sdks\3.0.0\frameworks\projects\framew

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

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

大家请先看
public function addPopUp 这个函数
里面一对代码都是关于如何在PopupManager中创建一个弹出窗口的代码,其中有一点很值得重视…

???? // Listenfor unload so we know to kill the window (and the modalWindow ifmodal)
? ?????// thishandles _all_ cleanup
? ?????window.addEventListener(Event.REMOVED,popupRemovedHandler);

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

跟着,如果我们要去除这个PopUp的时候是调用RemovePopup的,我们看看这个函数是怎么写的

? ? public functionremovePopUp(popUp:IFlexDisplayObject):void
? ? {
? ?????// all wewant to do here is verify that this popup is one of ours
? ?????// and removeit from the display list; the REMOVED handler will do therest
? ?????// (this isso that we never leak memory, popups will self-manage even if
? ?????//??removePopUpis not called).
? ?????if (popUp&& popUp.parent)
? ?????{
? ?????? ?consto:PopUpData = findPopupInfoByOwner(popUp);
? ?????? ?if (o)
? ?????? ?{
? ???????? ? constsm:ISystemManager = ISystemManager(popUp.parent);
? ???????? ?
? ???????? ? if(o.topMost)
? ?????????????sm.popUpChildren.removeChild(DisplayObject(popUp));
? ???????? ? else
? ?????????????sm.removeChild(DisplayObject(popUp));
? ?????? ?}
? ?????}
? ? }

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

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

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

?

养成良好的编程习惯。注意一写变量定义范围。不用的对象,事件要及时删除。

热点排行