Flex面试题2

一.简述Flex内存释放优化原则。什么情况会发生内存经泄露,一旦有内存泄露,你会如何解决? 

FLEX内存释放优化原则: 
1. 被删除对象在外部的所有引用一定要被删除干净才能被系统当成垃圾回收处理掉; 
2. 父对象内部的子对象被外部其他对象引用了,会导致此子对象不会被删除,子对象不会被删除又会导致了父对象不会被删除; 
3. 如果一个对象中引用了外部对象,当自己被删除或者不需要使用此引用对象时,一定要记得把此对象的引用设置为null; 
4. 本对象删除不了的原因不一定是自己被引用了,也有可能是自己的孩子被外部引用了,孩子删不掉导致父亲也删不掉; 
5. 除了引用需要删除外,系统组件或者全局工具、管理类如果提供了卸载方法的就一定要调用删除内部对象,否则有可能会造成内存泄露和性能损失; 
6. 父对象立刻被删除了不代表子对象就会被删除或立刻被删除,可能会在后期被系统自动删除或第二次移除操作时被删除; 
7. 如果父对象remove了子对象后没有清除对子对象的引用,子对象一样是不能被删除的,父对象也不能被删除; 
8. 注册的事件如果没有被移除不影响自定义的强行回收机制,但有可能会影响正常的回收机制,所以最好是做到注册的事件监听器都要记得移除干净。 
9. 父对象被删除了不代表其余子对象都删除了,找到一种状态的泄露代码不等于其他状态就没有泄露了,要各模块各状态逐个进行测试分析,直到测试任何状态下都能删除整个对象为止。 

内存泄露情况: 

1. 引用泄露:对子对象的引用,外部对本对象或子对象的引用都需要置null; 
2. 系统类泄露:使用了系统类而忘记做删除操作了,如BindingUtils.bindSetter(),ChangeWatcher.watch()函数时候完毕后需要调用ChangeWatcher.unwatch()函数来清除引用 ,否则使用此函数的对象将不会被删除; 
类似的还有MUSIC,VIDEO,IMAGE,TIMER,EVENT,BINDING等。 
3. 效果泄露:当对组件应用效果Effect的时候,当本对象本删除时需要把本对象和子对象上的Effect动画停止掉,然后把Effect的target对象置null; 如果不停止掉动画直接把 Effect置null将不能正常移除对象。 
4. SWF泄露:要完全删除一个SWF要调用它的unload()方法并且把对象置null; 
5. 图片泄露:当Image对象使用完毕后要把source置null;(为测试); 
6. 声音、视频泄露: 当不需要一个音乐或视频是需要停止音乐,删除对象,引用置null; 

内存泄露解决方法: 
1. 在组件的REMOVED_FROM_STAGE事件回掉中做垃圾处理操作(移除所有对外引用(不管是VO还是组件的都需要删除),删除监听器,调用系统类的清除方法) 
先remove再置null, 确保被remove或者removeAll后的对象在外部的引用全部释放干净; 
2. 利用Flex的性能优化工具Profile来对项目进程进行监控,可知道历史创建过哪些对象,目前有哪些对象没有被删除,创建的数量,占用的内存比例和用量,创建过程等信息; 


二.你常用的Flex框架是什么?简述一下它的特点。 
mate. 
特点:Flex应用是基于事件驱动的,而Mate框架使其变得更加得简单,Mate允许用户定义是谁正在管理/处理这一事件,以及数据是否需要从服务器端返回,或者其他的什么事件需要被触发,所有的这些都使得Flex应用的开发变得更加得简单。 

三.Flex是如何与flash协作的? 
实现编码与设计的好处是显而易见的: 

1.代码易于维护与二次开发。所有AS代码以面向对象的思想在flash外部组织,用notepad即能打开。比起传统的as2分散于frame之间,以及更早的分散于影片与按纽之上,其优点好处不言而喻。 

2.设计独立于代码之外。可以在没有程序员的清况下,修改程序(系统) 的外观,亦可以新做一批theme;程序没有变,只是改改图片和排列位置,大小等,就可以迅速焕然一新。譬如,在春节时,加一些春节的时令元素进去,这将是一件很容易做的事情。 

四.如何提升Flex运行效率,请从各方面进行简述。 

1、避免容器的多级嵌套,减少相对尺寸、相对定位的使用。 
在使用百分比来给容器内的元件定尺寸,一旦容器中的任何一个元件的位置和尺寸变化,都会引发容器对所有子级的重定位动作。如果嵌套的级别很深,这个计算量会很大。 

2、尽量使用轻量级的容器 
Canvas是体积最小的容器,它只支持绝对定位。很多时候,都可以使用它来代替HBOx和VBox。另外,Canvas也是我们编写自定义容器性质组件的一个首选。它具有容器的基本功能,利于扩展。 

3、避免使用大体积的组件,比如DataGrid、AdvancedDataGrid 
大个子组件的功能强大,但开销也是非常大的。由于功能的复杂性,使得皮肤、样式、itemRenderer的实现都格外复杂。 

4、处理数据时多用分页的方式 
在使用数据类型控件时,尽量减少数据一次的显示量。比如TileList,它会把数据一次性全部创建,不管是不是需要显示,这样很浪费资源。 ViewStack 、TabNavigator等在处理元件时,并不是一次创建,只要元件在第一次被显示时才创建,这样,就避免的不必要的开销。 

5、setStyle和styleName 
Flex 组件的皮肤都是可视化元件,组件在自身初始化时,会使用当前的样式比如styleName完成所有皮肤元件的绘制。如果我们在运行期间通过 setStyle修改了组件的样式,组件的尺寸、位置就会作相应调整。联系到第一条,如果组件位于一个层级很深的容器中,也会有一个大的计算量。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值