一. 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) |