昨天遇到个内存泄露的情况。查到最后发现加载外部的一个.swf里面的倒影截的位图没清除导致的。 推测loader.unloadAndStop()虽然会关闭流,但是并不释放被加载的程序中产生的BitmapData。
切记:**除了纯粹的试听对象,所加载的外部程序中有监听、回调、创建了BitmapData的,此外部程序在被unload前请自行了断。**否则你再怎么gc都吃着内存。
解决方案:
这种情况,我一般让被加载的flash程序实现一个dispose方法,加载它的loader在unloadAndStop()前先try一下dispose(); 外部程序在提供的dispose方法中自行了断。自行了断的步骤各不相同,需要根据自身在存活期间所作所为来有的放矢地消灭自我才行。总体来讲包括:斩断自己所相关的回调、监听,释放内存(声音关闭、视频清除、关闭网络连接、清除位图数据)。
就像这样,主文件中: private function closeExFlash() : void { try { (exFlashLoader.content as IDispose).dispose(); }catch(e : *) { } try { exFlashLoader.unloadAndStop(); }catch(e : *) { } this.visible = false; }
还有一种方法: 被加载的Flash自己维护。这种方法只适用于文档类直接用来放到舞台的,我并不常这样做(我很多情况下把swf作为runtime sharelib用,加载进去只是需要其中一些类)—— 被加载的Flash自己监听remove_from_stage事件,该事件触发时释放自己内存,上面说的斩断自己所相关的回调、监听,释放内存(声音关闭、视频清除、关闭网络连接、清除位图数据)。同时确保主程序中没有对它的引用。
技术内容转载请注明来源,个人日记不允许转载,欢迎指出任何有错误或不够清晰的表达。可以邮件至 mousebomb@gmail.com