Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Статьи (http://www.flasher.ru/forum/forumdisplay.php?f=101)
-   -   ActionScript 3 Tips and Tricks (http://www.flasher.ru/forum/showthread.php?t=85645)

MerlinTwi 27.09.2006 11:43

ActionScript 3 Tips and Tricks
 
senocular из Сан-Франциско опубликовал 100 советов по ActionScript 3
Для начинающего работать в AS3 эти советы бесценны. Здесь перевод на русский:
  1. Изменение частоты кадров flash-ролика
  2. Методы класса теперь связаны с областью видимости класса
  3. Объект Graphics и методы для рисования
  4. Новые типы переменных
  5. Отображаемые объекты (Display Objects)
  6. Новая директива Import
  7. Приведение типов и оператор as
  8. Уникальность переменных в классах
  9. Новое поведение MouseMove
  10. Ключевое слово delete и члены класса
  11. Класс Dictionary
  12. Метки
  13. Событие MOUSE_LEAVE или как узнать что мышка за пределами SWF
  14. Класс SimpleButton
  15. Немного о синтаксисе в Array
  16. Пакеты в AS3
  17. Вспомогательные классы
  18. Права доступа
  19. Абстрактные классы
  20. Ключевое слово override
  21. Использование прототипов (prototype)
  22. Регулярные выражения RegExp
  23. Подход к сортировке глубин
  24. Полное Копирование объекта
  25. Одинаковые имена свойств
  26. EventDispatcher
  27. События и типы событий
  28. Запись XML в тексте скрипта
  29. Определение имени класса
  30. Вызов super()
  31. Определение метки текущего фрейма (Frame Label)
  32. Несколько аргументов в trace()
  33. Вызов обработчика события без события
  34. URLRequest вместо строки URL
  35. XML или XMLDocument
  36. Загрузка текста и XML с использованием URLLoader
  37. Оператор is вместо instanceof
  38. Timelines как класс
  39. Использование RegExp для проверки email
  40. Событие Render
  41. Оператор @ для работы с атрибутами XML
  42. Распространение событий
  43. Получение спектра звука
  44. Преобразование Number() больше не поддерживает восьмеричную систему
  45. Сборщик мусора
  46. Мягкие ссылки
  47. Использование картинок из библиотеки (library)
  48. Изменения в typeof
  49. getBounds() и getRect()
  50. Разница между for..in и for each..in
  51. Значения по умолчанию для параметров функции
  52. Неопределенное количество аргументов при вызове функции
  53. arguments
  54. Пространство имен (namespaces)
  55. Оператор :: для уточнения пространства имен
  56. Динамичность класса не наследуется
  57. Создание события mouseWithin
  58. Ключевое слово final
  59. MXMLC: SWF Metadata Tag
  60. Класс Proxy
  61. Оператор in
  62. Методы getProperty и setProperty класса Proxy
  63. instance name мувиклипа на сцене
  64. XML и XMLList
  65. Константы
  66. Аналог duplicateMovieClip
  67. Метод callProperty класса Proxy
  68. Копирование динамической графики
  69. TextField.appendText()
  70. Директива include
  71. Двойное объявление переменной
  72. mouseEnabled и блокирование событий
  73. Свойство mouseChildren
  74. Различия между rollOver/rollOut и mouseOver/mouseOut
  75. DisplayObjectContainer contains()
  76. Освобождение слушателей событий при удалении с экрана
  77. Определение добавления или удаления со Stage
  78. Фазы событий
  79. Определение фазы события
  80. Предотвращение распространения события
  81. Глобальные события
  82. Реализация onReleaseOutside в AS3
  83. Document Class
  84. Доступ к stage и root
  85. use namespace
  86. Используйте ColorTransform вместо класса Color
  87. Класс Error, ошибки выполнения
  88. Ошибки: try..catch..finally
  89. Перехват асинхронных ошибок
  90. Операторы (.) и (..) для XML
  91. Array.indexOf и Array.lastIndexOf
  92. "asfunction:" теперь "event:"
  93. Proxy: методы перечисления
  94. Перехват событий мышки и mouseEnabled
  95. Strict Mode
  96. System.totalMemory
  97. Закрытие сетевых соединений
  98. Класс Timer
  99. Взаимодействие между AVM2 и AVM1
  100. Класс ByteArray
Скачать

MerlinTwi 27.09.2006 12:02

Изменение частоты кадров flash-ролика
 
В ActionScript 3, можно динамически менять частоту кадров (frame rate) ролика используя класс Stage.
Класс Stage (flash.display.Stage) связан со сценой главного ролика и имеет свойство frameRate, которое может принимать значения от 0.01 до 1000, и определяет частоту кадров, с которой Flash плеер проигрывает ролик. Изменять это значение можно на лету.
Код:

// изменить частоту кадров на 12 fps:
stage.frameRate = 12;


MerlinTwi 27.09.2006 12:22

Методы класса теперь связаны с областью видимости класса
 
ActionScript 3 полностью базируется на классах. Создавая классы, вы создаете переменные и функции (методы) которые связаны с экземпляром класса. В отличие от ActionScript 2 методы в ActionScript 3 сохраняют область видимости их класса, даже если вызываются из другого объекта, или через Function.call и Function.apply. Например:
Код:

package {
    import flash.display.Sprite;
   
    public class ClassScope extends Sprite {
       
        public function ClassScope() {     
            traceThis(); // "Class Instance"
           
            var obj:Object = new Object();
            obj.traceThis = traceThis;
            obj.traceThis(); // "Class Instance"
           
            traceThis.call(new Sprite()); // "Class Instance"
        }

        public override function toString():String {
            return "Class Instance";
        }
       
        public function traceThis():void {
            trace(this);
        }
    }
}


MerlinTwi 27.09.2006 12:42

Объект Graphics и методы для рисования
 
Как и в ActionScript 1,2 в ActionScript 3 есть методы для динамического рисования в отображаемых объектах (movie clips, sprites, и т.п.), которые имеют свойство graphics (flash.display.Graphics). Свойство graphics выступает в роли специального слоя для рисования, который расположен под всеми дочерним клипами. Так же в ActionScript 3 добавлены новые методы для рисования прямоугольников (в том числе и со скругленными углами), окружностей и эллипсов:
  • drawCircle(x:Number, y:Number, radius:Number):void
  • drawEllipse(x:Number, y:Number, width:Number, height:Number):void
  • drawRect(x:Number, y:Number, width:Number, height:Number):void
  • drawRoundRect(x:Number, y:Number, width:Number, height:Number, ellipseWidth:Number, ellipseHeight:Number):void
Пример:
Код:

// Нарисовать синий прямоугольник со скругленными углами:
var square:Sprite = new Sprite();
square.graphics.beginFill(0xFF);
square.graphics.drawRoundRect(0, 0, 100, 50, 10, 10);
square.graphics.endFill();
addChild(square);


MerlinTwi 27.09.2006 22:02

8. Уникальность переменных в классах
 
В ActionScript 2 переменные со значениями объявленные в теле класса сохранялись в прототипе класса. Из-за этого возникали проблемы с переменными, которые являются ссылками на объекты (например массивы Array):
Код:

class myClass{
  public var list:Array = [1,2,3];
}
var a = new myClass();
var b = new myClass();
trace(a.list === b.list); // true

Здесь a.list и b.list фактически ссылаются на один и тот же массив.
В ActionScript 3 этой проблемы нет, такие переменные будут уникальны.

MerlinTwi 27.09.2006 22:30

Новое поведение MouseMove
 
В ActionScript 2 событие MouseMove срабатывало глобально, неважно над каким клипом находилась мышка, любой listener от Mouse или любой мувиклип получали событие о перемещении мышки.
В ActionScript 3 для того чтобы получать события от мышки, нужно у интерактивного клипа (InteractiveObject такие как Sprites, MovieClips, Stage) добавить слушателя событий мышки (Listener), но события будут приходить только тогда, когда мышка находится над этим клипом. Для того чтобы получать события мышки в любом месте ролика, нужно добавить Listener к Stage.
Код:

stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);

Огион 28.09.2006 12:25

10. Ключевое слово delete и члены класса

MerlinTwi 28.09.2006 13:03

14. Класс SimpleButton
 
В ActionScript 3 появился новый класс SimpleButton (flash.display.SimpleButton). Теперь можно динамически с помощью ActionScript создавать кнопки (Button).
Код:

var myButton:SimpleButton = new SimpleButton();
Класс SimpleButton имеет 4 основных свойства, которые управляют возможными состояниями кнопки: upstate (кнопка не нажата), overState (мышка над кнопкой), downstate (кнопка нажата), и hitAreaState (область реагирования на мышку). Необходимо создать визуальные объекты для этих состояний и присвоить их к соответствующим свойствам.
Код:

myButton.upState = mySprite1;
myButton.overState = mySprite2;
myButton.downState = mySprite3;
myButton.hitAreaState = mySprite4;


Огион 28.09.2006 13:11

11. Класс Dictionary
12. Метки

MerlinTwi 28.09.2006 13:20

17. Вспомогательные классы
 
Один класс описывается в одном .as файле, так было в ActionScript 2 так остается и в ActionScript 3, но теперь есть возможность включать вспомогательные классы в тот же .as файл в дополнение к основному классу.
Вспомогательные классы описываются после блока package и видны только основному классу (или функции) в блоке package, или другим вспомогательным классам, описанным в этом же файле.
Код:

package {
    class MyClass {
        function MyClass() {
            var helper:MyHelper = new MyHelper();
        }
    }
}
class MyHelper {
    function MyHelper() {
        var helper:HelpersHelper = new HelpersHelper();
    }
}
class HelpersHelper {
    function HelpersHelper () {
    }
}

Запомните, что только один класс может быть описан в блоке package. Вспомогательные классы описываются в этом же файле, но после package и могут использоваться только основным классом.

MerlinTwi 28.09.2006 14:38

18. Права доступа
 
В ActionScript 3 добавлено два новых ключевых слова для описания прав доступа и усовершенствовано свойство private по сравнению с ActionScript 2. Итак, теперь мы имеем следующие ключевые слова для регулирования прав доступа:
  • public
  • protected
  • private
  • internal (по умолчанию)

public: то же самое, что и в ActionScript 2, все определенное как public может быть прочитано откуда угодно.
Конструкторы теперь всегда public.

protected: новое ключевое слово, указывает, что метод или переменная скрыта от всех кроме классов потомков.
Классы и конструкторы не могут быть определены как protected.

private: в ActionScript 2 было это ключевое свойство, но фактически работало как protected, т.е. классы потомки имели полный доступ к методу или свойству, описанному как private. Теперь в ActionScript 3 private это полноценная приватность, т.е. доступ только в этом классе, в котором метод или переменная описана, для всех остальных, включая потомков, она не будет существовать. Это означает, что в классе-потомке можно объявить еще одну переменную или метод с таким же именем и при этом не возникнет никаких конфликтов.
Классы и конструкторы не могут быть определены как private.

internal: аналогично public, но ограничено пределами пакета (package). Только классы, описанные в этом же пакете, будут иметь доступ к internal переменным или методам.
Internal ставится по умолчанию для любого класса, переменным или методам класса, кроме конструкторов, которые всегда public.

Права доступа во вспомогательных классах немного отличаются. Поскольку они фактически описываются вне пакета (package), то переменные или методы, объявленные как internal будут доступны только классам, описанным в этом же файле.

В ActionScript 3 проверка прав доступа осуществляется не только на этапе компиляции, но и при выполнении, т.е. хаки использовавшиеся в ActionScript 2, чтобы получить доступ к скрытым методам больше не будут работать.

Рассмотрим все это на примерах.
Пример 1.
Код:

package {
   
    import flash.display.Sprite;
   
    // Класс AccessControl  объявлен как public (по умолчанию был бы internal)
    public class AccessControl extends Sprite {
       
        // Конструктор всегда public
        function AccessControl() {
           
            // Только классы описанные в этом файле
            // имеют доступ к вспомогательным классам
            var helper:Helper = new Helper();
           
            trace(helper.pubNum); // OK - это public
            // trace(helper.protNum); // Error – нет доступа к protected
            // trace(helper.privNum); // Error – нет доступа к private
            trace(helper.interNum); // OK - это internal
        }
    }
}

// Класс Helper по умолчанию internal
class Helper {
   
    // public – переменная видна отовсюду
    public var pubNum:Number = 1;
   
    // protected – доступ только из классов потомков
    protected var protNum:Number = 2;
   
    // private – доступно только в этом классе
    private var privNum:Number = 3;
   
    // internal – доступно только в этом же package,
    // но для вспомогательного класса это означает,
    // что только для классов описанных в этом файле
    internal var interNum:Number = 4;
       
    // Конструктор всегда public
    function Helper() {
    }
}

// класс SubHelper будет internal
// Потомок вспомогательного класса Helper
class SubHelper extends Helper {
   
    // Конструктор всегда public
    function SubHelper() {
        trace(pubNum); // OK – это public
        trace(protNum); // OK – т.к. мы являемся потомком
        // trace(privNum); // Error – нет доступа к private
        trace(interNum); // OK – в этом же файле
    }
}

Пример 2.
Код:

package {
   
    import flash.display.Sprite;
    import containers.*; // описано ниже
   
    // Класс AccessControl  объявлен как public (по умолчанию был бы internal)
    public class AccessControl extends Sprite {
       
        // Конструктор всегда public
        function AccessControl() {
           
            // Есть доступ из другого пакета (packages)
            // только если класс public
            var bowl:Bowl = new Bowl(); // OK
            // var basket:Basket = new Basket(); // Error – нет доступа к internal
           
            trace(bowl.pubNum); // OK
            // trace(bowl.protNum); // Error - нет доступа к protected
            // trace(bowl.privNum); // Error - нет доступа к private
            // trace(bowl.interNum); // Error - нет доступа к internal
        }
    }
}

Код:

package containers {

    // Класс public доступен везде
    public class Bowl {
       
        // Переменная public доступна везде
        public var pubNum:Number = 1;
       
        // protected – доступ только у наших потомков
        protected var protNum:Number = 2;
       
        // private – доступ только в этом классе
        private var privNum:Number = 3;
       
        // internal – доступ только в этом пакете (package)
        internal var interNum:Number = 4;
           
        // Конструктор всегда public
        function Bowl() {
           
            // Есть доступ к inteneral т.к. в этом же пакете
            var basket:Basket = new Basket();
           
            trace(basket.pubNum); // OK
            // trace(basket.protNum); // Error – нет доступа к protected
            // trace(basket.privNum); // Error - нет доступа к private
            trace(basket.interNum); // OK – в этом же пакете
           
            // clone объявлен как public
            var basketCopy:Basket = basket.clone();
        }
    }
}

Код:

package containers {
   
    // interal – доступ только в этом пакете (package)
    internal class Basket {
       
        // public – доступ отовсюду
        public var pubNum:Number = 1;
       
        // protected – доступ только у потомков
        protected var protNum:Number = 2;
       
        // private – доступ только в этом классе
        private var privNum:Number = 3;
       
        // internal – доступ только в этом пакете (package)
        internal var interNum:Number = 4;
       
        // Конструктор всегда public
        function Basket() {
        }
       
        // public – доступ отовсюду
        public function clone():Basket {
            var basket:Basket = new Basket();
            basket.pubNum = pubNum; // OK
            basket.protNum = protNum; // OK – этот же класс
            basket.privNum = privNum; // OK - этот же класс
            basket.interNum = interNum; // OK
            return basket;
        }
    }
}


Огион 29.09.2006 12:14

19. Абстрактные классы
20. Ключевое слово override

Временно не буду иметь возможность продолжить, минимум до понедельника.

Nirth 30.09.2006 22:38

23 Подход к сортировке глубин
 
В ActionScript 3.0, подход к управлению глубинами DibsplayObject'ов изменился. Разберем пример, когда мы хотим поставить мувики с наибольшей "y" координатой наверх, а наименьшей в низ, в AS 1-2, мы могли просто назначить им глубину, в ActionScript 3, мы работаем с массивом дочерних объектов, а значит никаких пустых глубин между двумя мувиками быть не может.

Один из способов сделать это, это отсортировать наши мувики в массиве. Сначала мы создадим массив с сылками на на мувики, после чего отсортируем его с помощью свойства sortOn.

Код:

var sortedItems:Array = new Array(mc1, mc2, mc3);
function arrange():void {
    sortedItems.sortOn("y", Array.NUMERIC);
    var i:int = sortedItems.length;
    while(i--){
        if (getChildAt(i) != sortedItems[i]) {
            setChildIndex(sortedItems[i], i);
        }
    }
}

Данный способ не столь краток как AS 1-2 вариант, но делает свое дело.

Nirth: я писал статью-обзор о коллекциях в AS3 и Flex Framework, с некоторыми другими коллекциями можно сотворить более качественную глубинную сортировку.

Nirth 30.09.2006 23:09

24 Полное Копирование объекта
 
С помощью класса ByteArray, мы можем копировать полностью объекты. Под полным копированием имеется ввиду, что мы можем копировать так же "дочерние" объекты копируемого объекта, и так далее. Например если у нас есть массив с объектами, и мы копируем его, то кроме самого массива скопируются и объекты.

Пример функции:
Код:

import flash.utils.ByteArray;

function clone(source:Object):* {
    var copier:ByteArray = new ByteArray();
    copier.writeObject(source);
    copier.position = 0;
    return(copier.readObject());
}

Использование:
Код:

newObjectCopy = clone(originalObject);
Nirth: Информация о классе не сохраняется, но мы можем воспользоватся кастингом:
Код:

package {
        import flash.display.*;
        import flash.utils.*;

        dynamic public class Test extends Sprite
        {
                public function Test()
                {
                        var user:UserInfo        = new UserInfo();
                                user.name            = "David";
                                user.email            = "david@david.com";
                                user.page                  = new HomePage();
                                user.page.title = "David";
                                user.page.url        = "david.com";
                               
                        trace("user class name:",getQualifiedClassName(user));
                        trace("user.page class name:",getQualifiedClassName(user.page));
                       
                        var user2:UserInfo = clone(user) as UserInfo;
                       
                        trace("user2 class name:",getQualifiedClassName(user));
                        trace("user2.page class name:",getQualifiedClassName(user.page));
                       
                }
               
                private function clone(source:Object):* {
                    var copier:ByteArray = new ByteArray();
                    copier.writeObject(source);
                    copier.position = 0;
                    return(copier.readObject());
                }
        }
}

class UserInfo
{
        internal var name:String;
        internal var email:String;
        internal var page:HomePage;
       
        public function UserInfo()
        {               
        }
}
class HomePage
{
        internal var url:String;
        internal var title:String;
       
        public function HomePage()
        {
        }       
}

Данный метод хорошо подходит для чистых DTO/VO объектов.

Aziz Zaynutdinoff 30.09.2006 23:37

21. Использование прототипов (prototype)
 
Прототип объекта в ActionScript — это объект, который существует среди классов, чьи значения доступны для всех экземпляров класса, к которым он (объект) принадлежит. В ActionScript 1.0/2.0 prototype использовался для контроля наследования класса. Когда экземпляр подкласса обращается к переменной, сначала проверяется наличиие этой переменной в текущем экземпляре класса, потом (если не нашел) в прототипе данного класса, потом в прототипе базового класса, и так далее по цепочке наследственности (прототипов), до тех пор пока есть базовые классы.

В ActionScript 3.0 наследование в основном управляется через Класс Наследований и не зависит от прототипа объекта. Однако, прототип объекта всё же существует и обеспечивает большую часть функциональности, как это было и в AS1.0/2.0

Каждый класс и внутриклассовая функция (метод), созданные в ActionScript 3.0 имеют прототипный объект связанный с ними. Для классов прототип имеет имеет аттрибут «read-only», что значит, что вы не можете изменять его значение новым. Однако, это вовсе не значит, что вы не можете задать новую переменную и присвоить ей значение внутри прототипа (иначе наличие прототипа было б бессмысленным ;)). Прототипы функций изменяемы, что позволяет создавать динамические классы, используя определение классов написанием функций и определением наследований через прототипы («old style» как это делалось раньше).

Пример:

ActionScript Code:
Код:

package {
 
    import flash.display.Sprite;
 
    public dynamic class MyClass extends Sprite {
     
        public function MyClass(){
         
            // prototype = new Object(); // ОШИБОЧНО, нельзя изменить прототип класса
            prototype.newValue = 1; // OK, добавляем (или удаляем) переменные в прототип
         
            trace(this.newValue); // 1
            trace(prototype.toString); // function Function() {}
            trace(prototype.addChild); // undefined
            trace(addChild); // function Function() {}

            // динамическое определение класса («old style»)
            var TempClass:Function = function():void {
                trace("Создаём TempClass");
            }
         
            TempClass.prototype = prototype; // OK, можно утсанавливать наследствования
         
            var tempObject:* = new TempClass(); // «Создаём TempClass»
         
            trace(tempObject.newValue); // 1
        }
    }
}

Помните: обязательно ставить префикс this, обращаясь к динамичным перемнным. Также следует учитывать, что методы класса Object динамичны и определены прототипом (поэтому не могу перекрываться при помощи override). также следует отметить, что tempObject имеет тип «*» вместо TempClass. Потому что TempClass распознаётся всего лишь как функция в AS3.0, не класс, хотя может использоваться и как класс. Все динамические классы (созданные как TempClass) всегда будут распознаваться как функции (хотя и существует тип Class), поэтому созданные таким путём классы всегда порождают собой экземпляры простых объектов.

Nirth 01.10.2006 00:30

25 Одинаковые имена свойств
 
В ActionScript 1, мы могли дать свойству экземпляра и свойству класса одинаковое имя, в ActionScript 2 ввели ограничение на это. Теперь в ActionScript 3 мы опять можем это делать.
Код:

package {
 
    import flash.display.Sprite;
 
    public class MyApp extends Sprite {
 
        private var variable:String;
        private static var variable:String;
         
        public function MyApp() {       
            this.variable = "foo";
            MyApp.variable = "bar";
         
            trace(this.variable); // "foo"
            trace(MyApp.variable); // "bar"
            trace(variable); // "foo"
        }
    }
}


Nirth 01.10.2006 00:52

В ActionScript 3 используется класс flash.events.EventDispatcher для работы с событиями (рассылка, подписка обработчиков). Одна из реализаций данного класса была доступна в ActionScript 2, но это был внешний класс, для работы с событиями в mx.* пакетах. Теперьэто встроенный класс, а значит он работает быстрее.

Кажды раз когда вы хотите обработать событие в ActionScript 3 (например "enterFrame" или "click") вы должны использовать методы EventDispatcher.
Теперь у классов нету методов вроде onEnterFrame, onPress, onLoad.

У EventDispatcher'а есть следующие методы:

addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
Метод подписывает обработчик события.
type - Тип(имя) события
listener - ссылка на функцию - обработчика
useCapture - используется ли capture фаза или bubbles фаза.
priority - приоритет вызова обработчика
useWeakReference - использовать слабую проверку типов.

dispatchEvent(event:Event):Boolean
Метод рассылает события.
event - Экземпляр класса Event или подкласса, который будет разослан.

hasEventListener(type:String):Boolean
Проверяет есть ли обработчик события у события указанного в параметре type

removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void
Удаляет обработчик событий, параметры аналогичны addEventListener

willTrigger(type:String):Boolean

Запомните, теперь в качестве слушателя выступают функции а не объекты как это было в случае с addListener.

Теперь о хорошем:
Нам больше не нужно использовать mx.utils.Delegate или подобные ему, теперь this указывает на то что надо.

У класса Event есть свойство target, которое ссылается на экземпляр который разослал событие, при использовании capture или bubble фаз, так же можно испоьзовать свойство currentTarget.

Простой пример
Код:

package {
 
    import flash.display.Sprite;
    import flash.events.Event;
 
    public class MyDispatcher extends Sprite {
     
        public function MyDispatcher() {
            addEventListener("customEvent", handleEvent);
            dispatchEvent(new Event("customEvent"));
        }
     
        private function handleEvent(event:Event):void {
            trace(event.type); // "customEvent"
        }
    }
}

Путем расширения класса EventDispatcher или любого другого класса, который его расширяет (все DisplayObject'ы его расширяют), ваш класс получает возможность разсылать и принимать события, тоесть они могут использовать dispatchEvent и addEventListener.

Но иногда нам нужно наследовать классы, которые не расширяют EventDispatcher, в этом случае мы можем реализовать интерфейс IEventDispatcher, и создать в классе экземпляр EventDispatcher. Тоесть мы используем композицию вместо наследования.

Пример:
Код:

package {
 
    import flash.display.Sprite;
    import flash.events.Event;
 
    public class MyDispatcher extends Sprite {
     
        public function MyDispatcher() {
            var dispatcher:CustomDispatcher = new CustomDispatcher();
            dispatcher.addEventListener("customEvent", handleEvent);
            dispatcher.dispatchEvent(new Event("customEvent"));
        }
     
        private function handleEvent(event:Event):void {
            trace(event.type); // "customEvent"
        }
    }
}

import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IEventDispatcher;

class CustomDispatcher implements IEventDispatcher {

    private var eventDispatcher:EventDispatcher;
     
    public function CustomDispatcher() {
        eventDispatcher = new EventDispatcher(this);
    }
 
    public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void {
        eventDispatcher.addEventListener.apply(null, arguments);
    }
    public function dispatchEvent(event:Event):Boolean {
        return eventDispatcher.dispatchEvent.apply(null, arguments);
    }
         
    public function hasEventListener(type:String):Boolean {
        return eventDispatcher.hasEventListener.apply(null, arguments);
    }
         
    public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void {
        eventDispatcher.removeEventListener.apply(null, arguments);
    }
         
    public function willTrigger(type:String):Boolean {
        return eventDispatcher.willTrigger.apply(null, arguments);
    }
}

Класс CustomDispatcher не наследует EventDispatcher, вместо этого он реализует интерфейс IEventDispatcher и содержит в себе экземпляр EventDispatcher, который занимается работой с событиями.

Nirth: В FAQ на flasher.ru есть еще несколько статей о событиях:
Создание и рассылка собственных событий
Обработка событий

artcraft 01.10.2006 17:34

97. Закрытие сетевых соединений
 
Предыдущие версии Flash плеера не могли оборвать соединение после начала загрузки данных с сервера. Например, если вы начали загружать 50-ти мегабайтный swf в свой ролик, но хотите прекратить загрузку т.к. юзер решил не ждать загрузки а посмотреть что-то другое, у вас ничего не получится. Единственным способом избежать продолжения загрузки было бы закрыть плэйер (например перейти на другую html страницу)

Теперь, исползуя AS3, вы можете остановить соединения и оборвать загрузку запросов сделанных плеером. Рассмотрим класс Loader (flash.display.Loader). Это субкласс displayObjectContainer-а который загружает внешний контент в ваш ролик. Вы можете загружать содержимое в этот класс используя метод load. Что бы оборвать процесс загрузки, вы должны исползовать метод close.

Пример:
Код:

var loader:Loader = new Loader();
var request:URLRequest = new URLRequest("image.jpg");
loader.load(request);
addChild(loader);

// abort loading if not done in 3 seconds
var abortID:uint = setTimeout(abortLoader, 3000);

// abort the abort when loaded
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, abortAbort);

function abortLoader(){
    try {
        loader.close();
    }catch(error:Error) {}
}
function abortAbort(event:Event){
    clearTimeout(abortID);
}

Обратите внимания что метод close() был помещён внутрь блока try..catch. Это сделано потому что сlose будет выдавать ошибку (IOError) в том случае если в данный момент нету открытого соединения (хотя в данном случае этого никогда не произойдёт, потому что после окончания загрузки Timeout будет удалён - тем не менее это хорошая практика)

MerlinTwi 02.10.2006 13:29

Регулярные выражения RegExp
 
ActionScript 3 поддерживает регулярные выражения! Реализация аналогична что и в JavaScript. Для создания регулярного выражения можно использовать конструктор RegExp или строку заключенную в слеши (/), например:
Код:

var reCon:RegExp = new RegExp("\\w+", "i");
var reLit:RegExp = /\w+/i;

Методы RegExp:
  • RegExp.exec()
  • RegExp.test()
Методы строк (String), которые работают в регулярными выражениями:
  • String.match()
  • String.replace()
  • String.search()

MerlinTwi 02.10.2006 14:14

27. События и типы событий
 
В ActionScript 3 все события имеют свой класс. Базовые события расположены в классе Event (flash.events.Event), события связанные с мышкой в классе MouseEvent ( flash.events.MouseEvent). Остальные классы событий расположены в пакете flash.events и все они потомки базового класса Event.
Вызывая EventDispatcher.dispatchEvent(), в качестве аргумента нужно передать экземпляр класса события Event (или любой потомок от Event). Например, для рассылки события "enterFrame" вызываем dispatchEvent, передавая ему экземпляр класса Event с типом (type) "enterFrame".
Код:

dispatchEvent(new Event("enterFrame"));
Когда вызывается функция обработчика события, ей в качестве аргумента передается этот экземпляр класса, из свойств которого можно узнать подробности о событии. Например, в type записан тип события.
Код:

addEventListener("enterFrame", eventHandler);
dispatchEvent(new Event("enterFrame"));
...
private function eventHandler(event:Event):void {
    trace(event.type); // "enterFrame"
}

Тип события это строка (String), все возможные типы событий записаны в константах классов событий. Например, событие "enterFrame" лучше записывать так: Event.ENTER_FRAME. События от мышки расположены в классе MouseEvent, например, событие по клику мышки: MouseEvent.CLICK. Для работы с событиями лучше использовать эти константы, чем писать тип события строкой, это убережет вас от ошибок и опечаток. Пример выше правильнее записать так:
Код:

addEventListener(Event.ENTER_FRAME, eventHandler);
dispatchEvent(new Event(Event.ENTER_FRAME));

Для генерации своих событий, можно использовать класс Event, указывая свои типы событий или же, создать класс потомок от Event, прописав в нем константы новых типов событий.

MerlinTwi 02.10.2006 14:17

28. Запись XML в тексте скрипта
 
В ActionScript 3 можно писать XML прямо в тексте скрипта, больше нет необходимости записывать XML в виде строки с последующим парсингом. Компилятор Flash проверяет синтаксис XML, что спасает от опечаток.
Код:

var myXml:XML =
        <body>
            <!-- comment -->
            text1
            <a>
                <b>text2</b>
            </a>
        </body>;


MerlinTwi 04.10.2006 12:45

29. Определение имени класса
 
В ActionScript 3 есть новая функция getQualifiedClassName (flash.utils.getQualifiedClassName) с помощью которой можно запросто узнать имя класса:
Код:

var sprite:Sprite = new Sprite();
trace(getQualifiedClassName(sprite)); // "flash.display::Sprite"

Можно узнать и название предка (superclass)
Код:

trace(getQualifiedSuperclassName(sprite)); // "flash.display::DisplayObjectContainer"
Для обратного преобразования названия в класс можно использовать функцию getDefinitionByName (flash.utils.getDefinitionByName)
Код:

trace(getDefinitionByName("flash.display::Sprite")); // [class Sprite]
Для получения детальной информации о классе в виде XML используйте describeType() (flash.utils.describeType)
Код:

var sprite:Sprite = new Sprite();
var spriteDescription:XML = describeType(sprite);
trace (spriteDescription);


MerlinTwi 04.10.2006 12:55

30. Вызов super()
 
В ActionScript 2, вызвать super() можно было только в самом начале конструктора класса, иначе компилятор сообщит об ошибке «The superconstructor must be called first in the constructor body». В ActionScript 3, super можно вызывать в любом месте конструктора.
Код:

package {
    public class SubClass extends SuperClass {
        protected var value:int;
        public function SubClass(value:int = 0) {
            this.value = value;
            super(20);
        }
    }
}


MerlinTwi 04.10.2006 13:11

31. Определение метки текущего фрейма (Frame Label)
 
В класс MovieClip (flash.display.MovieClip) добавлены новые методы для работы с метками фреймов: currentLabels и currentLabel.
currentLabels - это массив всех меток FrameLabel (flash.display.FrameLabel) которые есть на timeline в мувиклипе. Каждый FrameLabel содержит два свойства: name:String – название метки, и frame:int – номер фрейма.
currentLabel - возвращает название метки текущего фрейма.
Код:

var label:String = my_mc.currentLabel;

MerlinTwi 04.10.2006 13:15

32. Несколько аргументов в trace()
 
В ActionScript 3, функции trace можно передавать любое количество аргументов, все они будут выведены в Output panel.
Код:

trace(value1, value2, value3);
P.S. В AS1 и AS2 аналогичного эффекта можно добиться используя массив:
Код:

trace([value1, value2, value3]);

MerlinTwi 04.10.2006 13:21

33. Вызов обработчика события без события
 
Обработчик события в ActionScript 3 должен получать один аргумент класса Event. Если же нужно самостоятельно вызывать функцию обработчика события, можно написать так:
Код:

myHandler(new Event(someEventType));
Что длинно и создает пустое ненужное событие, гораздо проще и удобнее в обработчике события присвоить дефолтное значение аргументу:
Код:

public function myHandler(event:Event = null):void {...}
...
// обычный вызов без события
myHandler();


MerlinTwi 04.10.2006 13:32

34. URLRequest вместо строки URL
 
Классы и функции работающие с URL в ActionScript 3 используют класс URLRequest (flash.net.URLRequest), который кроме самой строки URL, содержит дополнительные свойства, более детально описывающие способ запроса:
  • contentType:String
  • data:Object
  • method:String
  • requestHeaders:Array
  • url:String
Например, для вызова navigateToURL() (flash.net.navigateToURL) (эта функция заменяет getURL() из предыдущих версий ActionScript) в качестве аргумента нужно передать экземпляр класса URLRequest:
Код:

var request:URLRequest = new URLRequest("http://www.adobe.com/");
navigateToURL(request);


etc 04.10.2006 15:12

Цитата:

Сообщение от MerlinTwi
name:int – название метки, и frame:String – номер фрейма.

Ошибся типом данных

MerlinTwi 05.10.2006 20:46

XML или XMLDocument
 
В ActionScript 3 работа с XML приведена к стандарту E4X - ECMAScript's XML specification. Этот подход обеспечивает более удобные методы работы с узлами и атрибутами XML дерева. Все методы собраны в новом классе XML (top level XML)
Код:

var myXML:XML = new XML(objectToConvert);
Код:

var myXML:XML = <node />;
Прежний XML класс, такой каким он был в ActionScript 1 и 2, так же остался, просто переименован в XMLDocument (flash.xml.XMLDocument). Если хотите работать с XML по старинке, то используйте XMLDocument вместо XML.
Код:

var myXML:XMLDocument = new XMLDocument("<node />");

MerlinTwi 05.10.2006 21:02

36. Загрузка текста и XML с использованием URLLoader
 
В предыдущих версиях ActionScript для загрузки внешнего текста использовали LoadVars или XML. В ActionScript 3 все собрано в один класс URLLoader (flash.net.URLLoader), который немного похож на прежний LoadVars. Из класса XML убрана функция по загрузки, теперь нужно загружать текст при помощи URLLoader, а затем передавать XML классу для преобразования.
Для начала загрузки нужно использовать метод load(), который получает один параметр URLRequest (это не просто строка URL!). Далее следует использовать события, для того, чтобы узнать об окончании загрузки или ошибке. Когда текст загружен, он сохраняется в свойстве data.
Пример:
Код:

var loader:URLLoader;
// ...
loader = new URLLoader();
loader.addEventListener(Event.COMPLETE, xmlLoaded);

var request:URLRequest = new URLRequest("file.xml");
loader.load(request);
//...
function xmlLoaded(event:Event):void {
    var myXML:XML = new XML(loader.data);
    //...
}


MerlinTwi 06.10.2006 13:56

Дополнение к заметке про абстрактные классы. Для создания своего абстрактного класса, можно использовать такой код:
Код:

package {
    public class Abstract {
        public function Abstract() {
            if( toString() == "[object Abstract]" ) throw( new Error( "Abstract must be extended" ) );
        }
    }
}


MerlinTwi 09.10.2006 16:37

37. Оператор is вместо instanceof
 
В ActionScript 3 введен новый оператор “is” (is operator) для проверки принадлежности экземпляра класса к типу класса или интерфейса.
Код:

var mySprite:Sprite = new Sprite();
trace(mySprite is Sprite);          // true
trace(mySprite is DisplayObject);    // true
trace(mySprite is IEventDispatcher); // true

Оператор is заменяет оператор instanceof (instanceof operator), использовавшийся в ActionScript 1 и 2. Оператор is проверяет цепочку наследования AS3 класса, в то время как instanceof проверяет цепочку прототипов (prototype). Отсюда несколько нюансов:
1. поскольку, AS3 классы воссоздают цепочку прототипов, то с помощью instanceof теоретически можно проверить принадлежность экземпляра класса к определенному типу AS3 класса, но не к интерфейсу:
Код:

var mySprite:Sprite = new Sprite();
trace(mySprite instanceof Sprite);          // true
trace(mySprite instanceof DisplayObject);    // true
trace(mySprite instanceof IEventDispatcher); // false – нет в цепочке прототипов

2. С помощью оператора is нельзя проверить тип динамического класса созданного не через наследование, а через прототип (стиль AS1):
Код:

var AS1StyleClass:Function = function(){}
AS1StyleClass.prototype = new MovieClip();

var as1Instance:* = new AS1StyleClass();
trace(as1Instance instanceof AS1StyleClass);    // true
trace(as1Instance instanceof MovieClip);        // true
trace(as1Instance is AS1StyleClass);    // true
trace(as1Instance is MovieClip);        // false

В AS3 следует использовать только оператор is, прежний оператор instanceof хоть и поддерживается, но компилятор будет выдавать предупреждение:
The instanceof operator is deprecated, use the is operator instead.

MerlinTwi 09.10.2006 16:57

38. Timelines как класс
 
Во Flash 9 вы можете ассоциировать timeline с классом, в том числе и рутовый. Timeline мувиклипа ассоциируется с классом так же как и в ActionScript 2 используя диалог linkage. Timeline рута может быть ассоциирован с классом в диалоге property inspector или в настройках публикации (publish settings - ActionScript settings).
Если вы написали код внутри фрейма в timeline, то он будет автоматически преобразован в класс. При этом переменные объявленные внутри какого-либо фрейма становятся свойствами класса, а функции методами класса. Поэтому вы не сможете объявить переменную или функцию с одинаковым названием в разных фреймах. Любой скрипт внутри фрейма ассоциируются с методом, который автоматически называется, когда происходит переход на этот фрейм.
Например, такой код написанный внутри фрейма:
Код:

var num:Number = 1;
function showNum():void {
    trace(num);
}
showNum();

Будет преобразован в примерно такой класс:
Код:

package {
    class TimelineClass extends MovieClip {
       
        public var num:Number = 1;

        public function showNum():void {
            trace(this.num);
        }
        // метод автоматически вызываемый при переходе на первый фрейм
        public function frame1():void {
            showNum();
        }
    }
}


MerlinTwi 09.10.2006 17:01

39. Использование RegExp для проверки корректности написания email
 
Пример, как можно использовать регулярное выражение (Top level RegExpх) для проверки корректности написания email:
Код:

function isValidEmail(email:String):Boolean {
    var emailExpression:RegExp = /^[a-z][\w.-]+@\w[\w.-]+\.[\w.-]*[a-z][a-z]$/i;
    return emailExpression.test(email);
}
//...
trace(isValidEmail("senocular@example.com")); // true
trace(isValidEmail("@example.com")); // false
trace(isValidEmail("senocular@example")); // false
trace(isValidEmail("seno\\cular@example.com")); // false


MerlinTwi 11.10.2006 12:51

41. Оператор @ для работы с атрибутами XML
 
В ActionScript 3 для удобства работы с XML добавлен новый оператор “@”, предназначенный для доступа к атрибутам XML, и является аналогом метода attribute (Top level XML.attribute()).
Код:

var myXML:XML = <user name="senocular" id="2867" />;
trace(myXML.attribute("name")); // senocular
trace(myXML.attribute("id")); // 2867
trace(myXML.@name); // senocular
trace(myXML.@id); // 2867

В операторе @ можно использовать звездочку (*) для получения списка всех атрибутов узла XML в формате XMLList, это будет аналогом метода attributes() (Top level XML.attributes()). Пример:
Код:

var myXML:XML = <user name="senocular" id="2867" />;
var atts:XMLList;

atts = myXML.attributes();
trace(atts.toXMLString());
/* Output:
senocular
2867
*/
atts = myXML.@*;
trace(atts.toXMLString());
/* Output:
senocular
2867
*/


MerlinTwi 11.10.2006 13:05

42. Распространение событий
 
ActionScript 3 поддерживает распространение события (event propagation) – передача одного события нескольким объектам. К примеру, в ActionScript 1 и 2 события для кнопок (такие как onPress, onRelease, …) перехваченные мувиклипом никогда не дойдут до вложенных в него мувиклипов, даже если мышкой кликнули именно по вложенному мувиклипу. Например, кликаем мышкой по мувиклипу child_mc, который вложен в parent_mc:
Код:

// AS1 и AS2
parent_mc.onPress = function(){
    trace("parent pressed");
}
parent_mc.child_mc.onPress = function(){
    trace("child pressed");
}

/* trace при клике мышкой по child_mc:
parent pressed
*/

А в ActionScript 3 событие будет передано обоим мувиклипам:
Код:

// AS3
parent_mc.addEventListener(MouseEvent.CLICK, parentClick);
parent_mc.child_mc.addEventListener(MouseEvent.CLICK, childClick);

function parentClick(event:MouseEvent):void {
    trace("parent pressed");
}
function childClick(event:MouseEvent):void {
    trace("child pressed");
}

/* trace при клике мышкой по child_mc:
child pressed
parent pressed
*/


MerlinTwi 12.10.2006 17:00

43. Получение спектра звука
 
Используя ActionScript 3 можно получить информацию о спектре проигрываемого flash-плеером в данный момент звука/музыки. Для этого можно вызывать статичный метод computeSpectrum класса SoundMixer (flash.media.SoundMixer), и в качестве параметра передать массив ByteArray, куда и будет записана информация о спектре: 256 чисел с плавающей запятой (floating-point в диапазоне -1.0 … 1.0) для левого канала и следом 256 чисел для правого канала.
Код:

// запустить проигрывание музыки
// ...
var spectrumInfo:ByteArray = new ByteArray();
SoundMixer.computeSpectrum(spectrumInfo);
// spectrumInfo теперь содержит информацию о спектре

Эту информацию можно использовать для создания визуализации звука, как в популярных медиа-плеерах.

MerlinTwi 12.10.2006 17:10

44. Преобразование Number() больше не поддерживает восьмеричную систему
 
В ActionScript 1 и 2 преобразовывая строку в число, используя Number(), если строка начиналась с нуля “0”, то число интерпретировалось как восьмеричное. Если строка начиналась с “0x”, то число интерпретировалось как шестнадцатеричное:
Код:

// ActionScript 1 и 2
trace(Number("010")); // 8

Это могло создать определенные проблемы, если вы ожидали получить обычное десятичное число. Теперь ActionScript 3 интерпретирует строку, начинающуюся с нуля как десятичное число.
Код:

// ActionScript 3
trace(Number("010")); // 10

Если же нужно интерпретировать строку как восьмеричное число (или в любую другу систему счисления), то нужно использовать функцию parseInt:
Код:

trace(parseInt("010", 8)); // 8

MerlinTwi 13.10.2006 11:48

45. Сборщик мусора (Garbage Collection)
 
Сборщик мусора (Garbage Collection - GC) автоматический процесс во Flash-плеере, который удаляет данные из памяти, когда они более не нужны. GC оценивает необходимость удаления по двум критериям: счетчик ссылок (reference counting) и очистка по меткам (mark and sweep)

1. Счетчик ссылок - это процесс, который следит за количеством переменных, ссылающихся на объекты в памяти.
Код:

var a:Object = new Object(); //создается новый объект и новая переменная "a", которая ссылается на этот объект, счетчик ссылок = 1
var b:Object = a; // еще одна ссылка на тот же объект, счетчик ссылок = 2

Когда не останется ни одной ссылки на объект, то он будет удален из памяти.
Код:

a=null; // счетчик ссылок стал равен 1
b=null; // счетчик ссылок стал равен 0, и объект будет удален из памяти

Есть случаи, когда счетчик ссылок не сработает, например:
Код:

var a:Object = new Object(); // счетчик ссылок на первый объект = 1
var b:Object = new Object(); // счетчик ссылок на второй объект = 1
a.b = b; // счетчик ссылок на второй объект = 2
b.a = a; // счетчик ссылок на первый объект = 2
a=null; // счетчик ссылок на первый объект = 1
b=null; // счетчик ссылок на второй объект = 1

Обе переменные "a" и "b" более не ссылаются на объекты, но первый объект доступен из второго и второй доступен из первого. В данном случае счетчик ссылок не сработает, пора приниматься за дело процессу очистке по меткам.

2. Очистка по меткам – это процесс, который сканирует все объекты от базового класса (root или stage) и помечает каждого, кого нашел. Все не найденные объекты недоступны и потому будут удалены. Из предыдущего примера про "a" и "b", поскольку "a" и "b" более недоступны из root они не будут помечены и будут удалены.
Код:

[root] <- сканирование...
    [objectRef (помечен)] <- сканирование...
          [objectRef (помечен)] <- сканирование...
          [objectRef (помечен)] <- сканирование...
    [objectRef (помечен)] <- сканирование...
    [objectRef (помечен)] <- сканирование...
...
[удалить все непомеченное]

Очистка по меткам очень ресурсоемкий процесс, поэтому выполняется редко, решение о том, когда запустить процессы удаления данных из памяти принимает flash-плеер сам, и программно инициировать эти процессы мы не можем.

MerlinTwi: Хочу обратить ваше внимание на то, что добавление обработчиков событий к объекту (или setInterval) не позволит сборщику мусора (GC) удалить этот объект, т.к. на него остаются ссылки из процессов рассылающих события. Например:
Код:

init();

function init():void {
        var test:Sprite = new Sprite();
        test.addEventListener(Event.ENTER_FRAME, handle);
}

function handle(e:Event):void {
        trace("enterFrame");
}

Локальная переменная test, ссылающаяся на созданный спрайт удалена, сам спрайт недоступен из root или stage, но он не будет удален из памяти т.к. спрайт слушает событие enterFrame, и функция handle будет продолжать срабатывать. Для того чтобы объект был удален, нужно освобождать слушаемые им события, когда они более не нужны:
Код:

test.removeEventListener(Event.ENTER_FRAME, handle);

MerlinTwi 13.10.2006 12:29

46. Мягкие ссылки
 
В ActionScript 3 есть две возможности поставить мягкую ссылку (Weak Reference) на объект, которая не будет учитываться счетчиком ссылок.
1. При использовании класса Dictionary его конструктору можно передать параметр true, чтобы использовались мягкие ссылки на объекты.
Код:

var dict:Dictionary = new Dictionary(true); // использовать мягкие ссылки
В этом случае Dictionary в качестве ключей будет использовать мягкие ссылки на объекты, которые не учитываются счетчиком ссылок и не мешают удалению объектов из памяти.
Код:

var obj:Object = new Object();
dict[obj] = true;
delete obj; // сборщик мусора удалит объект obj, поскольку ссылка на него из dict мягкая

2. Можно добавить слушатель события с мягкой ссылкой. У addEventListener последний параметр указывает, использовать мягкую ссылку или обычную (по умолчанию). При использовании мягкой ссылки, не удаленный обработчик события не помешает удалению объекта из памяти.
Код:

// addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
addEventListener(MouseEvent.CLICK, clickHandler, false, 0 true); // использовать мягкую ссылку

MerlinTwi: Для понимания мягкой ссылки в addEventListener, рассмотрим случай из предыдущего примера. Используем мягкую ссылку при создании слушателя события enterFrame:
Код:

init();

function init():void {
        var test:Sprite = new Sprite();
        test.addEventListener(Event.ENTER_FRAME, handle, false,0,true);
}

function handle(e:Event):void {
        trace("enterFrame");
}

Теоретически сборщик мусора должен удалить спрайт, т.к. на него не остается ссылок из переменных, из root он недоступен, и обработчик события enterFrame стоит мягкий. Вот только когда сработает сборщик мусора, решает flash-плеер сам… через секунду, через час, день? И до тех пор, пока сборщик мусора не удалит спрайт из памяти, функция handle будет исправно срабатывать каждый фрейм.
Экспериментально был найден способ заставить сборщик мусора сработать немедленно, нужно создать много объектов для которых потребуется выделение большого куска памяти. Подтолкнем таким способом сборщик мусора сработать по клику мышки:
Код:

init();
addEventListener(MouseEvent.CLICK, immediatelyGC);

function init():void {
        var test:Sprite = new Sprite();
        test.addEventListener(Event.ENTER_FRAME, handle, false,0,true);
}

function handle(e:Event):void {
        trace("enterFrame");
}

function immediatelyGC(e:Event):void {
        trace("run GC");
        var ar:Array = new Array();
        for (var i:int=0; i<100000; i++) {
                ar.push( new Object() );
        }
}

В трейсе будет:
. . .
enterFrame
enterFrame
enterFrame
run GC

После клика мышки и запуска функции immediatelyGC, сборщик мусора удалил спрайт из памяти и более функция handle не вызывается.


Часовой пояс GMT +4, время: 20:44.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.