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 垃圾回收器是如何工作的? flash player 8 之前采用的是引用计数法,在 flash player 8 之后用的是标记法,简单的说就是:从应用的根节点开始,遍历所有其上的引用, 标记每个它所发现的对象 然后迭代遍历每个被标记的对象,标记它们的子对象这个过程第归进行, 直到 Player 遍历了应用的整个对象树并标记了它所发现的每个东西在这个过程技术的时候,可以安全地认为,内存中那些没有被打标记的对象没有任何活动引用,因此可以被安全地释放内存一般来说, flash player 采用的是一种低频的垃圾回收机制,Flash Player的垃圾回收发生在Flash Player需要另外请求内存之前但并不是每次应用申请内存时都会导致垃圾回收的执行, 只有当 Flash 占用的内存紧张到一定程度时才会执行真正的垃圾回收, 一定程度上取决于客户端计算机的物理内存的大小6. flex和后言是如何交互的?无疑就这两种方法:remote object 或者是Http service 7. 你是如何处理前端速度慢的问题? flex前端速度慢其实仔细说应该分2 部分,1. 是 flex生成的 swf 由于 SDK庞大的关系, swf 体积也跟着庞大了,这我们可以做的就是用Module 动态加载, 还有就 是 RSL了。
2. 处理速度慢, 远程方法速度慢, 这是 AVM 的硬伤了, 基本没有很好的解决方法, 我们能做的只是让这个异步进行的更完美一些,让用户在等待的过程中,做其他的事情,以至于让用户忽略这段等待的时间8.flash与 flex是如何协调开发的?这个问题可以这样来理解,如果是确实需要用到 FLEX SDK 的应用,那我们就可以建立一个flex工程,具体需要 flash做 UI 的时候,输出成 swc作为 flex的 skin ,如果说并不需要flex sdk,只是为了编码方便而选择 flex 的话, 那我们只要建立一个as 工程, 让 flex 作为 flash的编码器9. 使用 Flex Bulider3建立一下新的 .mxml 的页面时默认的背景是蓝色的, 请问用什么办法能修改掉此背景颜色, 以至于下次创建时背景不是为默认的蓝色的呢?请 写出你认为正确的方法 . 还真不会,我的做法一般是在这个工程里面,建一个总的 css,都在里面规范起来,包括背景色啊,还有字体大小等等10. 使用 Flex Bulider3如何跟踪程序 ? 装个 debug版本的 flash player,到时候在 FB里面 F11 debug 它咯。
11. 请问 enterFrame 和 timerEvent这 2 个事件有什么区别 ?请说下具体的使用方法和相关的使用场合 ? 不会 我觉得差不多,不过我一般用enterFrame ,还请高人指点12. 请说下你理解 AS3的事件机制是什么机制 ?你认为正确的就可以说出来. AS3事件流分三个阶段 : 1. 捕获阶段 ( 即由根节点流向子节点 , 检测每个节点是否注册了监听器 ) 2. 目标阶段 ( 激发在目标对象本身注册的监听程序) 3. 冒泡阶段( 从目标节点到根节点 , 检测每个节点是否注册了监听器) 当中涉及了两个属性target 和 currentTarget,target是事件的派发者 ,currentTarget是正在检测的对象, 当开始了事件流, 事件的 currentTarget属性处于不断变化中 . PS:注册事件时捕获阶段默认是关闭的, 无论事件是否开启了捕获 , 事件流只会两选一去执行注册的监听程序关于EventDispatcher三个函数的参数 : 1.addEventlistener(事件类型 , 监听函数 , 是 否打开捕获阶段 , 监听器优先级别 ,是否打开弱监听 ) 2.removeEventListener(事件类型 , 监听函数 , 是否打开捕获阶段) ( 前两个参数是必须的 , 如果注册监听器时打开了捕获阶段, 那么第三个参数也是必须的 , 否则会出现错误 ) 3.dispatchEvent(new Event( 事件类型 , 是否冒泡, 是否可以取消事件 ) 关于 Event 扩展有两点要注意 : 1. 可以定义字符串常量代表事件类型 . 2. 构造函数必须调用父类的构造函数,super(type,bubbles,cancelable) 3.扩展 Event 可以使 Event 带自定义变量, 从而可以传递数据 . 13. 请问 addEventListener里面有几个参数 , 你能说出具体的使用方法嘛? 这题出的有点像考 API 记忆力呵呵,它的五个参数分别是addEventlistener(事件类型, 监听函数 , 是否打开捕获阶段 , 监听器优先级别 , 是否打开弱监听 ) 具体使用方法:详见手册,这里我copy 来了。
addEventListener () 方法 public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void 语言版本 : ActionScript 3.0 RuntimeVersions: AIR 1.0, Flash Player 9 使用 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 ,则该函数将作为垃圾回收并且不再是永久函数如果创建对该内部函数的引用(将该函数保存到另一个变量中),则该函数将不作为垃圾回收并仍将保持永久。