您好,欢迎访问三七文档
Flex,AS面试题1。as2与as3.的最主要区别是什么?答:首先,as2和as3是完全不同的语言,几乎没有兼容性可言。as2编译用的AVM1虚拟机,as3用的AVM2,速度快,提供了一些基础异常处理。as3是纯的OOP,强类型语言。as2不是。具体的差别有太多太多。2.flex的开发框架有哪些,它们有什么优缺点?答:最常见的当然是Cairngorm、Puremvc了,此外还有Mate,Swiz等等,据说被广泛应用的已经有10几款了。Cairngorm作为Adobe官方出品,有着贵族血统的它比较全面,是这些框架中已知bug最少的,但是基于他的应用相对臃肿复杂一些,需要对每个可以被触发的事件写一个对应的Command,编码量巨大,并且单元测试很不容易,不适合敏捷开发。Puremvc应该是现在用的最多的as框架了。比较完善、并且与Cairngorm相比,更适合中小型应用的开发,它与Cairngorm一样,也是以MVC模式为中心,并以Façade作为中央存储器的单件类的形式进行开发的。说下Mate,它是一个比较奇怪的框架,是基于标签的事件驱动型的。也就是说你不能再随意的写as类的,在使用Mate的情况下,只能用MXML来做这些事情。Swiz是Mate的孪生兄弟,长的挺像,没具体用过,不大了解。3.在flex开发中,很多代码都写在mxml文件里,为了做到mvc模式,你是怎么处理的。我认为mxml并不影响mvc模式啊。分两种情况来讨论,首先,是自己创建整个应用结构的时候,那我们可以手动将UI所在的mxml归为一类,然后由Mediator去操作或者说控制这些组件既可了,然后Mediator又统一交给Controller去操作。如果采用其他框架来进行开发的话,那就更不用来考虑这个问题了,像Cairngorm、Puremvc之类的框架已经很好的为我们解决了这些问题。只要按照它们的使用规范来进行开发,自然没有问题。4.如果发生内存泄露,你是如何解决的?在profile观察中已经内存泄漏是没有很好的解决办法的,至少我不知道,我能做的只是尽量去避免这种情况的发生,比如说注意不要循环引用,特别是在使用Timer的时候要格外注意,不要忘记全局对象上的引用的清除,在创建控制器和模型的时候要注意一定要使用单件模式。在addEventListener时候尽量采用弱引用、自引用、或者子对象引用,以避免内存泄漏。5。as3.0垃圾回收器是如何工作的?flashplayer8之前采用的是引用计数法,在flashplayer8之后用的是标记法,简单的说就是:从应用的根节点开始,遍历所有其上的引用,标记每个它所发现的对象。然后迭代遍历每个被标记的对象,标记它们的子对象。这个过程第归进行,直到Player遍历了应用的整个对象树并标记了它所发现的每个东西。在这个过程技术的时候,可以安全地认为,内存中那些没有被打标记的对象没有任何活动引用,因此可以被安全地释放内存。一般来说,flashplayer采用的是一种低频的垃圾回收机制,FlashPlayer的垃圾回收发生在FlashPlayer需要另外请求内存之前。但并不是每次应用申请内存时都会导致垃圾回收的执行,只有当Flash占用的内存紧张到一定程度时才会执行真正的垃圾回收,一定程度上取决于客户端计算机的物理内存的大小。6flex和后台语言是如何交互的?无疑就这两种方法:remoteobject或者是Httpservice7。你是如何处理前端速度慢的问题?flex前端速度慢其实仔细说应该分2部分,1.是flex生成的swf由于SDK庞大的关系,swf体积也跟着庞大了,这我们可以做的就是用Module动态加载,还有就是RSL了。2.处理速度慢,远程方法速度慢,这是AVM的硬伤了,基本没有很好的解决方法,我们能做的只是让这个异步进行的更完美一些,让用户在等待的过程中,做其他的事情,以至于让用户忽略这段等待的时间。8.flash与flex是如何协调开发的?这个问题可以这样来理解,如果是确实需要用到FLEXSDK的应用,那我们就可以建立一个flex工程,具体需要flash做UI的时候,输出成swc作为flex的skin,如果说并不需要flexsdk,只是为了编码方便而选择flex的话,那我们只要建立一个as工程,让flex作为flash的编码器。9.使用FlexBulider3建立一下新的.mxml的页面时默认的背景是蓝色的,请问用什么办法能修改掉此背景颜色,以至于下次创建时背景不是为默认的蓝色的呢?请写出你认为正确的方法.还真不会,我的做法一般是在这个工程里面,建一个总的css,都在里面规范起来,包括背景色啊,还有字体大小等等。。10.使用FlexBulider3如何跟踪程序?装个debug版本的flashplayer,到时候在FB里面F11debug它咯。11.请问enterFrame和timerEvent这2个事件有什么区别?请说下具体的使用方法和相关的使用场合?不会我觉得差不多,不过我一般用enterFrame,还请高人指点。。12.请说下你理解AS3的事件机制是什么机制?你认为正确的就可以说出来.AS3事件流分三个阶段:1.捕获阶段(即由根节点流向子节点,检测每个节点是否注册了监听器)2.目标阶段(激发在目标对象本身注册的监听程序)3.冒泡阶段(从目标节点到根节点,检测每个节点是否注册了监听器)当中涉及了两个属性target和currentTarget,target是事件的派发者,currentTarget是正在检测的对象,当开始了事件流,事件的currentTarget属性处于不断变化中.PS:注册事件时捕获阶段默认是关闭的,无论事件是否开启了捕获,事件流只会两选一去执行注册的监听程序关于EventDispatcher三个函数的参数:1.addEventlistener(事件类型,监听函数,是否打开捕获阶段,监听器优先级别,是否打开弱监听)2.removeEventListener(事件类型,监听函数,是否打开捕获阶段)(前两个参数是必须的,如果注册监听器时打开了捕获阶段,那么第三个参数也是必须的,否则会出现错误)3.dispatchEvent(newEvent(事件类型,是否冒泡,是否可以取消事件))关于Event扩展有两点要注意:1.可以定义字符串常量代表事件类型.2.构造函数必须调用父类的构造函数,super(type,bubbles,cancelable)3.扩展Event可以使Event带自定义变量,从而可以传递数据.13.请问addEventListener里面有几个参数,你能说出具体的使用方法嘛?这题出的有点像考API记忆力呵呵,它的五个参数分别是addEventlistener(事件类型,监听函数,是否打开捕获阶段,监听器优先级别,是否打开弱监听)具体使用方法:详见手册,这里我copy来了。。addEventListener()方法publicfunctionaddEventListener(type:String,listener:Function,useCapture:Boolean=false,priority:int=0,useWeakReference:Boolean=false):void语言版本:ActionScript3.0RuntimeVersions:AIR1.0,FlashPlayer9使用EventDispatcher对象注册事件侦听器对象,以使侦听器能够接收事件通知。可以为特定类型的事件、阶段和优先级在显示列表的所有节点上注册事件侦听器。成功注册一个事件侦听器后,无法通过额外调用addEventListener()来更改其优先级。要更改侦听器的优先级,必须首先调用removeListener()。然后,可以使用新的优先级再次注册该侦听器。请记住,注册该侦听器后,如果继续调用具有不同type或useCapture值的addEventListener(),则会创建单独的侦听器注册。例如,如果首先注册useCapture设置为true的侦听器,则该侦听器只在捕获阶段进行侦听。如果使用同一个侦听器对象再次调用addEventListener(),并将useCapture设置为false,那么便会拥有两个单独的侦听器:一个在捕获阶段进行侦听,另一个在目标和冒泡阶段进行侦听。不能只为目标阶段或冒泡阶段注册事件侦听器。这些阶段在注册期间是成对出现的,因为冒泡阶段只适用于目标节点的始祖。如果不再需要某个事件侦听器,可调用removeEventListener()删除它,否则会产生内存问题。由于垃圾回收器不会删除仍包含引用的对象,因此不会从内存中自动删除使用已注册事件侦听器的对象。复制EventDispatcher实例时并不复制其中附加的事件侦听器。(如果新近创建的节点需要一个事件侦听器,必须在创建该节点后附加该侦听器。)但是,如果移动EventDispatcher实例,则其中附加的事件侦听器也会随之移动。如果在正在处理事件的节点上注册事件侦听器,则不会在当前阶段触发事件侦听器,但会在事件流的稍后阶段触发,如冒泡阶段。如果从正在处理事件的节点中删除事件侦听器,则该事件侦听器仍由当前操作触发。删除事件侦听器后,决不会再次调用该事件侦听器(除非再次注册以备将来处理)。参数type:String—事件的类型。listener:Function—处理事件的侦听器函数。此函数必须接受Event对象作为其唯一的参数,并且不能返回任何结果,如下面的示例所示:function(evt:Event):void函数可以有任何名称。useCapture:Boolean(default=false)—确定侦听器是运行于捕获阶段、目标阶段还是冒泡阶段。如果将useCapture设置为true,则侦听器只在捕获阶段处理事件,而不在目标或冒泡阶段处理事件。如果useCapture为false,则侦听器只在目标或冒泡阶段处理事件。要在所有三个阶段都侦听事件,请调用addEventListener两次:一次将useCapture设置为true,一次将useCapture设置为false.priority:int(default=0)—事件侦听器的优先级。优先级由一个带符号的32位整数指定。数字越大,优先级越高。优先级为n的所有侦听器会在优先级为n-1的侦听器之前得到处理。如果两个或更多个侦听器共享相同的优先级,则按照它们的添加顺序进行处理。默认优先级为0。useWeakReference:Boolean(default=false)—确定对侦听器的引用是强引用,还是弱引用。强引用(默认值)可防止您的侦听器被当作垃圾回收。弱引用则没有此作用。类级别成员函数不属于垃圾回收的对象,因此可以对类级别成员函数将useWeakReference设置为true而不会使它们受垃圾回收的影响。如果对作为嵌套内部函数的侦听器将useWeakReference设置为true,则该函数将作为垃圾回收并且不再是永久函数。如果创建对该内部函数的引用(将该函数保存到另一个变量中),则该函数将不作为垃圾回收并仍将保持永久。14.请问我想判断一个字体是否是数字,用什么办法去判断呢?这问题问的有点奇怪。字体怎么可能是数字。。。如果是问,类型是否为数字,那就typeof一下,看他是不是int或者Number,如果是问字符串内容是否为数字,那也有很多办法,比如说,读出每个字符的ascii码,判断范围,或者是vara:String=1232d4;varb:Number=Number(a);varc:String=String(b);if(a==c){Alert.show(yes);}else{Alert.show(no);}虽然山寨了点,但也不失为一种选择。15.请问我想判断一个字符或者一个对象的类型怎么判断呢?应该没人出这样的题吧?if咯。类型的话就typeof16.请问你了解internal控制符么?能说下具体使用方法和场合嘛?internal比pr
本文标题:Flexas面试题
链接地址:https://www.777doc.com/doc-2873953 .html