Chinaunix首页 | 论坛 | 博客
  • 博客访问: 284662
  • 博文数量: 64
  • 博客积分: 3099
  • 博客等级: 中校
  • 技术积分: 615
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-29 19:38
文章分类

全部博文(64)

文章存档

2015年(1)

2014年(7)

2013年(6)

2012年(3)

2010年(11)

2009年(3)

2008年(19)

2007年(14)

我的朋友

分类: 系统运维

2012-07-21 10:41:10

一.    As重载和重写
覆盖(override)和重载(overload)。覆盖是指子类重新定义父类的虚函数的做法。而重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。

覆盖即重写,继承父类后override方式可以重新定义一个函数的逻辑。
重载,AS并不支持重载,可以通过...args传递不同参数实现不同逻辑:
   private function testOverLoad(...args) {  
              switch (typeof(args[0])) {  
                  case "object" :  
                      testFuncObj(args);  
                      break;  
                  case "number" :  
                      testFuncNum(args);

二 垃圾回收机制 标识-清除法查找非活动对象

Flash Player从你的应用程序根对象(root)开始直到程序中的每一个引用,都为引用的对象做标记。接下来,Flash Player遍历所有标记过的对象。它将按照该特性递归整个对象树。并将从一个活动对象开始能到达的一切都标记。该过程结束后,Flash Player可以安全的假设:所有内存中没有被标记的对象不再有任何活动引用,因此可以被安全的删除。

三 浅复制和深复制

复制一个数组,是指生成一个新的数组,内容和原有数组一样。

当数组中所有元素均为基础数据类型的时候两种复制效果一样,因为字符串和数字等基本数据类型都使用传值的方式。

生成数组浅复制的方法很简单,只需要调用原书组的 slice 方法或者 concat 方法,不传任何参数,即可生成数组的浅复制:
var copy:Array = originaArray.concat();
var copy:Array = originaArray.slice();


使用深复生成的新数组,其所有元素都是真正的数组元素的备份。这时两个数组中相同未知的元素,存放的是不同的引用,指向不同的对象。但是这两个独享的状态是完全一致的。

使用 ByteArray 实现数组的深复制:
var ba:ByteArray = new ByteArray();
ba.writeObject(A);
ba.position = 0;
var b:Array = ba.readObject() as Array;

四 弱引用和强引用

强引用也就是我们通常所讲的引用,其存亡直接决定了所指对象的存亡。
如果不存在指向一个对象的引用,并且此对象不再显示列表中,则此对象会被从内存中释放。
弱引用除了不决定对象的存亡外,其他与强引用相同。即使一个对象被持有无数个若引用,只要没有强引用指向他,那麽其还是会被清除。

五 Array Vector 和 Dictionary

与 Array 类似,您可以使用数组访问运算符([])设置或检索 Vector 元素的值。一些 Vector 方法还提供了用于设置和检索元素值的机制。其中包括 push()、pop()、shift()、unshift(),等等。Vector 对象的属性和方法与 Array 的属性和方法类似(大多数情况下完全相同)。对于大多数需要使用所含的所有元素都具有同一数据类型的 Array 的情况,Vector 实例都更为可取。不过,Vector 实例是密集数组,这意味着它必须在每个索引中具有一个值(或 null)。Array 实例没有这样的限制。

可使用后缀类型参数语法指定 Vector 的基本类型。类型参数语法是一个序列,其中依次包含点 (.)、左尖括号 (<)、类名称和右尖括号 (>),如下例所示:

在此示例的第一行内容中,变量 v 声明为 Vector. 实例。换句话说,它表示一个只能容纳 String 实例的 Vector(数组),并且从中只能检索 String 实例。第二行代码构造了同一 Vector 类型的实例(即,一个所有元素均为 String 对象的 Vector),并将该实例分配给 v。

var v:Vector.; v = new Vector.();
使用 Vector. 数据类型声明的变量只能存储用相同的基本类型 T 构造的 Vector 实例。例如,不能将通过调用 new Vector.() 构造的 Vector 分配给使用 Vector. 数据类型声明的变量。基本类型必须完全匹配。例如,不会对下列代码进行编译,原因是对象的基本类型与变量声明的基本类型不同(即使 Sprite 是 DisplayObject 的子类):

// This code doesn't compile even though Sprite is a DisplayObject subclass var v:Vector. = new Vector.();
要将基本类型为 T 的 Vector 转换为超类 T 的 Vector,请使用 Vector() 全局函数。

除数据类型限制之外,Vector 类还具有其他一些限制,从而有别于 Array 类:

Vector 是一种密集数组。与 Array 不同,Vector 必须在每个索引中包含一个值(或 null),而前者可以只在索引 0 和 7 中包含值(即使位置 1 到 6 中不存在任何值)。
Vector 可以具有固定长度,这意味着其所包含的元素数量不可更改。
对 Vector 的元素的访问需要接受范围检查。绝对不能从大于最后一个元素 (length - 1) 的索引中读取值。绝对不能对超过当前最后一个索引一个以上的索引设置值(也就是说,只能在现有索引或索引 [length] 中设置值)。
由于 Vector 具有这些限制,因此 Vector 相对于所有元素均为单个类的实例的 Array 实例有三个主要优点:

性能:使用 Vector 实例时的数组元素进行访问和迭代的速度比使用 Array 时的速度要快很多。
类型安全性:在严谨模式下,编译器可以识别数据类型错误。数据类型错误的例子包括将数据类型错误的值分配给 Vector 或从 Vector 中读取值时要求错误的数据类型。但请注意,当使用 push() 方法或 unshift() 方法向 Vector 添加值时,在编译时不会检查参数的数据类型,而是在运行时检查。
可靠性:相对于 Array,运行时范围检查(或定长检查)极大地提高了可靠性。

如果不提前指定矢量的大小,则矢量大小将在矢量用完空间后增加。每次矢量大小增加时,都将分配一个新的内存块。矢量的当前内容会复制到新内存块中。这种额外的分配和复制数据会降低性能。
new Vector.(300000, true);

Dictionary是一种特殊的数组。他的键值是对象的引用。所以内容和键值发生联系时,就可以用这个,但是要注意他的强引用和弱引用。

六 Timer和EnterFrame

Timer基于系统时钟,在时间间隔不是很小的情况下较EnterFrame准确,但处理ui动画时不如EnterFrame平滑顺畅。EnterFrame基于帧频,该事件的派发间隔受帧频影响,不如Timer准确。
阅读(869) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~