之前写过一篇关于itemrenderer的帖子:http://www.fluidea.cn/blog/archives/82,这里算是续。
自定义itemRenderer是个强大的功能,但如果使用不当,就会出现很多奇怪的现象,比如内存泄露就是一个很常见的问题。
常见的两种问题: 1.在自定义itemRenderer中使用creationComplete事件来处理数据 有些朋友习惯在组件中把初始化处理都写在creationComplete事件处理函数中,一般情况下,这没有问题,然而在自定义itemRendere,却不合适。 因为itemRenderer是循环使用的,也就是说,itemRendere在第一次创建后,可能用来显示不同的数据,而本身只被创建一次,creationComplete事件只发生一次,自然就会出问题。 这个问题很常见,可能引发很多奇怪的现象,比如对象无法被清除,资源释放不完全,内存泄露等等。 那如何避免?我们可以覆盖data存取器的setter方法,比如:
override public function set data(value:Object):void{ //加上自己的代码 }
2.删除数据后系统资源仍被占用 在解决了第一个问题后,还是有可能出现资源无法正确释放的问题。比如TileList组件可显示40条数据,每一条数据都包括一张位图。当删除数据,从50减少4时,会发现显示的数目确实减少了,但系统消耗的资源却不变。数据量越大,这个现象就越明显。 问题出在哪里?根据现象,从逻辑上推测:数据量减少,也就是已有的itemRenderer实例被“删除”的时候,并没有释放资源。 这就是问题所在,已有的itemRenderer并不会被删除,一旦创建就一直存在,所谓的“删除”,仅仅是将它变为不可见,而占有的资源不会自动释放,如果其中包括了位图、声音、动画,将一直存在,成为系统资源杀手。 我提供的解决方法:监听itemRenderer的hide事件,在变为不可见的同时,手动释放资源。也许有其它更好的方法,就等着你去发现了。