`
FlexEye
  • 浏览: 17526 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

AS3 的事件机制(三)

阅读更多

本节内容:
1.弱引用的使用原则
2.listener的不同和this关键字的指向。


继续上次的话题。在讲listener 和 this关键字之前,我们先来讲讲一个高级话题:
弱引用的使用原则。

新手可以不看,因为暂时用不到。但这个话题很有必要。当设计大型RIA应用程序时,弱引用必须要了解。
弱引用从原则上来讲,其引入是为了防止无意识的对象保留(unintentional object retention)引起的内存泄漏。
什么是无意识的对象保留?一般情况下,对象的逻辑生命周期和实际生命周期应当相同。但是在某些情况下,比如事件侦听器机制,我们可能会创建一个引用,它在内存中生存的时间比我们预期的要长很多。比如说,下面的例子中,即使删掉了侦听器lis,但事件还是能被继续捕捉。这是由于并没有removeEventListenr,那么系统中还会保留着对侦听器的引用。
如果没有把addEventListener中对侦听器的持有改成弱引用,那么这个侦听器会一直存在、耗掉内存不被人发觉。但如果设成了弱引用,那么垃圾回收器过段时间后会将侦听器占用的内存回收,此时侦听器从物理意义上才真正的被销毁了。
在销毁之前,这个侦听器还会继续存在,继续作用。这就是为什么下例中虽然已经把useWeakReference设为了true,但是还是会有作用。
那么什么时侯垃圾回收器(Garbage Collector)才会来回收呢?
唔,这要看它高兴了,快的话10分钟,慢的话一个月。哈哈,开玩笑,垃圾回收器的工作时间咋一看确实是不可测的,但也有规律可循。但这个问题探讨在本系列教程中显得过于艰深,会单独撰文来说明垃圾回收器的部分工作机制。

那么推论来了,我们凭什么要把useWeakReference设为false呢?除非我们有意要让某个侦听器在失去了其他所有引用的时候还要工作,才有可能这样做。但谁会有这样疯狂的想法呢?道哥还是包世宏?
所以,我建议,大家不妨养成习惯,把useWeakReference设为true。
当然最好的做法是始终记得不用侦听器了,一定要removeEventListener。在这一点上,我们要坚持“始乱终弃”!!

//这个是Document Class,建个fla,绑定这个class。忘了,就看第三篇教程。

package
{
	import flash.display.MovieClip;
	import flash.events.EventDispatcher;
	import flash.events.MouseEvent;

	public class LearnEvents extends MovieClip
	{
		function LearnEvents()
		{
			var lis:Function=function()
			{
				trace("听到了鼠标Click事件!");
			}
			var kingda_s:KingdaSprite=new KingdaSprite(0xFFCC00, "kingdaSquare");
			addChild(kingda_s);
			kingda_s.addEventListener(MouseEvent.CLICK, lis, false, 0, true); //瞧,最后一个参数,已经把弱引用设为true了
			lis=null; //这一句,我已经从逻辑上删掉lis了,大家作证啊
			trace("侦听器还在吗?:" + lis); //lis也确实指向null了。但你只要继续点击方块,你会发现Click事件仍然被捕捉到。
		}
	}
}
import flash.display.Sprite;
import flash.events.MouseEvent;

//这个类就是画一个矩形,
class KingdaSprite extends Sprite
{
	public var nickname:String;
	public var ColorNum:uint;

//colorNumber就是#ffcc00这种类型的数,在AS3中推荐用新的uint型来标记它
	public function KingdaSprite(colorNumber:uint, nameString:String)
	{
		ColorNum=colorNumber;
		nickname=nameString;
		graphics.beginFill(ColorNum);
		graphics.drawRect(0, 0, 100, 100);
		graphics.endFill();
	}

}

 

Listener和As2.0有何不同,和this关键字的“改进了的记忆力”
DOM Level 3中规定的是用Object来做listener。该Object有用来处理事件的方法(method)。
AS3虽然是按照DOM Level 3事件机制设计的,但也不完全听话,有自己独立的想法。在AS3中,侦听器就是函数。也只能用函数来侦听。
其实在ActionScript3中,Function实质也是一种特殊的Object,和AS2.0有相似之处。
见文章:
ActionScript高级技巧:深入了解Function
因此AS3.0为什么限定用Function,这和它的架构有关,不细说了。
但有趣的是,在AS3.0中,对IEventDispatcher的定义中,仍然按照DOM3标准用Object来做Listener。见上一篇教程和随后的评论。

那么问题来了,function中this关键字的指向会怎样?
AS2.0开发者对AS2.0 事件机制中 this关键字的水性杨花应该深有认识。如果用function做侦听器,那么谁发出事件,this就指向谁。这就等于对象之间乱搞关系,啊呀呀。所以MM派了一个Delegate代理警察类来管理。唉,糜乱的岁月不堪回首啊。

//ActionScript 2.0例子:拷贝以下代码到第一帧,拖一个button到舞台,命名为kingda_btn;function lisFunc() { trace ("亲爱的,你会指向谁:"+ this.name);   //我们本意应当是指向_root;}kingda_btn.addEventListener("click", lisFunc); //点一下button,看看指向谁。
回到ActionScript 3.0,来看看坚定的夫妻关系,总结为:嫁鸡随鸡,嫁狗随狗,什么都不嫁,那就属于global。我靠,读一下,还挺押韵。大家也好记。
简单的解释一下,函数在哪个对象里(应该叫method),那么this就指向谁。不在对象里,那么就指向global。

package
{
	import flash.display.Sprite;
	import flash.events.MouseEvent;

	public class AddListener extends Sprite
	{
		public function AddListener()
		{
			//用package外面定义的类KingdaSprite创建一个实例,由于同文件中,所以不用import啦
			var outsideChild:KingdaSprite=new KingdaSprite(0x00FF00, "outside_sprite");
			addChild(outsideChild); //没有了这一句,你啥都看不到。
			outsideChild.addEventListener(MouseEvent.CLICK, inclassHandler); //注册类里面的侦听器
			outsideChild.addEventListener(MouseEvent.CLICK, outsideHandler); //注册类外面的侦听器                       
		}

		private function inclassHandler(event:MouseEvent):void
		{
			trace("类里面的侦听器侦听到MouseEvent事件: " + event);
			trace("this关键字指向:" + this);
		}

	}
}

function outsideHandler(event:MouseEvent):void
{
	trace("类外面的侦听器侦听到MouseEvent事件: " + event);
	trace("this关键字指向:" + this);
}
import flash.display.Sprite;
import flash.events.MouseEvent;

//这个类就是画一个矩形,然后你点击这个矩形会发出标准鼠标click的事件
class KingdaSprite extends Sprite
{
	public var nickname:String;
	public var ColorNum:uint;

	//colorNumber就是#ffcc00这种类型的数,在AS3中推荐用新的uint型来标记它
	public function KingdaSprite(colorNumber:uint, nameString:String)
	{
		ColorNum=colorNumber;
		nickname=nameString;
		graphics.beginFill(ColorNum);
		graphics.drawRect(0, 0, 100, 100);
		graphics.endFill();
	}
}

 


本文来自CSDN博客:http://blog.csdn.net/baijinwen/archive/2007/04/04/1551773.aspx

分享到:
评论

相关推荐

    仿AS3实现PHP 事件机制实现代码

    在本文中,我们将探讨如何在PHP中模仿ActionScript 3(AS3)的事件机制。AS3中的事件处理是基于观察者模式,它允许对象之间进行通信而不必直接耦合。在PHP中实现类似机制可以帮助我们创建更灵活、可扩展的代码结构。 ...

    as3事件属性

    ### AS3事件属性详解 #### 一、引言 在ActionScript 3.0 (简称AS3)中,事件处理机制是程序设计的核心之一。掌握AS3中的事件属性及其应用场景对于开发高质量的交互式应用程序至关重要。本文将深入探讨AS3事件流中的...

    AS3中的事件处理.txt

    ActionScript 3.0的事件机制是基于文档对象模型(DOM3)的。这意味着AS3中的事件处理遵循DOM3规范中定义的模式和标准。这一模型提供了统一的方式来处理各种类型的事件,包括但不限于鼠标事件、键盘事件等。这种标准...

    flash as3 的例子

    以下是一些关于AS3事件处理的关键知识点: 1. **事件类**:AS3中所有的事件都继承自Event类,比如MouseEvent、KeyboardEvent和TimerEvent等。每个事件类都有特定的类型,比如"click"或"keydown"。 2. **事件流**:...

    Flash CS3 +AS3键盘事件

    通过以上内容,我们了解了Flash CS3与AS3中的键盘事件处理机制,这为创建丰富的交互体验奠定了基础。实际应用中,开发者可以根据需求进行更复杂的逻辑设计,如组合键、延迟处理、按键持续时间等。结合`keyCodes.fla`...

    最经常遇到的AS3面试题

    AS3事件机制使用Observer模式,允许对象之间的松耦合,事件分发者可以将事件发送给事件监听器,事件监听器可以选择是否接收事件。 11. addEventListener的使用方法 addEventListener方法用于添加事件监听器,需要...

    AS3中文版帮助文档

    8. **错误处理**:AS3的错误处理机制通过Error类和try...catch语句实现,可以帮助开发者更好地调试和优化代码。 9. **声音和视频**:AS3提供了丰富的API来处理音频和视频,包括播放、暂停、音量控制等。 10. **...

    FLASHAS3代码

    5. 事件模型:AS3采用了基于事件的编程模型,事件监听和分发机制让程序响应用户交互和系统变化。如点击按钮、加载完成等事件,都可以通过addEventListener()和removeEventListener()来处理。 五、图形绘制 6. 可...

    as3 chm as3.chm 帮助文档

    2. **事件驱动编程**:AS3中的事件模型是其核心机制之一,允许响应用户交互或其他程序事件。事件监听器注册(addEventListener)和移除(removeEventListener)是处理事件的关键。 3. **显示列表**:AS3的显示列表...

    as3 开源组件

    AS3开源组件是ActionScript 3的开源库和框架集合,它们为开发人员提供了一系列预构建的功能和组件,用于创建富互联网应用程序(RIA)或Flash平台上的交互式内容。ActionScript 3是Adobe Flash Player和Adobe AIR支持...

    FlipPage-as3

    4. **事件监听与交互**:利用AS3的事件处理机制,可以监听用户的鼠标点击、拖动等交互行为,实时响应并驱动翻页动画。通过`EventDispatcher`和`EventListener`接口,可以精确地控制用户与翻页效果的交互过程。 5. *...

    AS3类图表.rar

    理解和使用AS3的事件监听器机制对响应这些事件至关重要。 7. **动画效果**:AS3提供了强大的动画功能,可以为图表添加平滑过渡和动态效果,提升用户体验。 8. **性能优化**:由于AS3图表可能涉及大量数据处理和...

    fabrication as3 多管道MVC框架

    1. **事件驱动的通信**:在AS3中,事件机制是实现不同组件间通信的关键。Fabrication AS3利用AS3的事件系统,使得模型、视图和控制器之间可以通过发布和监听事件进行通信,确保了代码的解耦合。 2. **数据绑定**:...

    AS3几个资料

    5. **事件处理**:AS3的事件驱动模型是其核心特性之一,通过监听和响应事件,可以实现用户交互和组件间的通信。 6. **面向对象编程**:AS3支持类、接口、包等面向对象概念,通过继承、封装和多态,可以构建可维护和...

    as3中文学习文档

    ### AS3中文学习文档知识点概览 #### 一、Adobe ActionScript 3.0简介 - **定义**:ActionScript 3.0 (AS3) 是一种强大的面向对象的编程语言,主要用于Adobe Flash Player和Adobe AIR环境下的应用程序开发。通过AS3...

    魔力学堂 flash as3 游戏 源代码

    总结,"魔力学堂"作为一款使用Flash AS3开发的游戏,其源代码揭示了AS3在游戏开发中的应用深度和广度,包括面向对象编程、事件驱动机制、图形动画、网络通信等多个方面。通过学习和分析,开发者不仅可以提升AS3编程...

    AS3中的EVENT

    在AS3编程中,理解和熟练运用事件机制是至关重要的,它可以有效管理用户交互、组件通信以及异步操作的回调。通过`eventTest.fla`和`eventTest.swf`文件,可以实践和探索这些概念,而`documentClasses`可能包含了项目...

    Flash as3 相册

    1. ActionScript 3.0(AS3):AS是Flash平台的脚本语言,AS3是其第三个主要版本,提供了更强大的性能和面向对象的编程结构。 2. Flash Professional:用于创建动画和交互式内容的图形编辑器,支持AS3编程。 3. fla...

    flash AS3.0 三维地球

    5. **交互性**: 为了让用户能够旋转、缩放和导航地球,AS3提供了事件监听和处理机制。例如,鼠标或触摸输入可以被用来控制视角,而键盘输入可能用于切换不同的显示模式。 6. **文件结构**: `earth.fla`是Flash的...

Global site tag (gtag.js) - Google Analytics