关于as3控制内存增长几个基础原则.doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Event listeners:? 事件侦听的响应函数所在对象默认会被添加引用计数,有以下两种方式可以避免事件侦听引起的内存泄漏 采用弱引用添加事件侦听(myObj.addEventListener( Event.SUP, this._onEvent, false, 0,?true?);) ,采用这种方式侦听响应函数对象不会被添加引用计数,若外部引用都被清空则对象将被垃圾回收,不再响应事件。 若采用强引用,则要要在不需要的时候手动调用removeEventListeneror 移除事件侦听器。 Clean up references:?如果?objA?有成员ob引用了?objB, 则直接设置?objB=null 将不会导致objB实例被垃圾回收,需要objA.ob=null之后才会将其回收。也就是说,一个对象的所有引用都被清理之后,其才会被垃圾回收(在AS中只要一个对象没有引用能追溯至根节点,即stage、static成员等,则会被垃圾回收)。 不注意清理引用是引起内存泄漏的一个常见问题。 a:obj = new obj(); b:obj = new obj(); a.foo = b; b.foo = a; a.foo =null; b.foo =null; a =null; b =null; class Loader { load(onFin:Function):void { thisptr = this; _lder.lod(function (){ onFin(thisptr); }); } } { lder = new Loader(); lder.load( function (l:Loader):void { l.xxx; } ); } class A { spr:Sprite; function A() { spr = new Sprite(); spr.addEventListener(xxx, onXXX, fal, 0, true); } function onXXX(evt:Event):void { } function dispose():void { spr.remvoeEventListener(xxx, onXXX); spr =null; } } { var a:A = new A(); a.dispose(); a = null; } { var lder:A = new A(); lder.load(xx); } Reuse objects:?对于需要频繁创建销毁的一些较复杂的对象,可以创建object pool来管理,当对象不需要使用时,可以用object pool回收对象,同时在对象上定义reset()函数初始化对象,需要使用对象时则从object pool取出对象并调用reset即可。 Immediately kill objects:?一些对象, 比如XML、BitmapData可以直接调用BitmapData.dispose()、System.disposeXML()直接释放其持有的内存。 Know the language:?需要进一步了解一些Flash的底层机制。比如DisplayObject设置?cacheAsBitmap = true;?实际上是在底层创建了一bitmap对象,旋转或缩放DisplayObject?将会导致这个bitmap对象的重新绘制. Filters也是一样。调用BitmapData.rect?实际上会每次都创建一个rectangle. Beware loops:?要小心循环的使用,对于可以放在循环外的新建对象、要尽量放在循环外. E.g.: // creates 100 Point objects for( var i:int = 0; i 100; i++ ) { var p:Point = new Point; p.x = myObjs[i].x; p.y = myObjs[i].y; // do something with p } vs. // creates 1 Point object var p:Point = new Point; for( var i:int = 0; i 100; i++ ) { p.x = myObjs[i].x; p.y = myObjs[i].y; // do something with p } Use Static members:对于一些需要大量创建的类成员公用变量、频繁创建的临时变量,可以考虑用静态变量进行替代。 A有大量对象实例被频繁调用foo的情况下: class A { var conf = {aa=1

文档评论(0)

187****5045 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档