Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Деструктор класса (http://www.flasher.ru/forum/showthread.php?t=132039)

Vogd 03.11.2009 11:40

Значит, я не понял о чем речь. Извините:)

dimarik 03.11.2009 15:18

Цитата:

Сообщение от Vogd (Сообщение 863028)
Ну почему же?

Код AS3:

this.parent.removeChild(this);

Очень даже работает.

Да Вы не расстраивайтесь =) У него вообще может не быть parent, да и сам объект может не быть наследником DisplayObject.

Denis_ex 03.11.2009 22:12

Цитата:

Сообщение от alatar (Сообщение 862997)
В функции destroy() (к примеру) вы должны только подготовить объект к удалению, а обнулять на него ссылку должен родитель, предварительно вызвав функцию destroy()

т.е. сначала ф-ей Destroy(), например удаляем все события связанные с эти классом, а также из списка отображения. Далее родителем обнуляем ссылку, таким образом объект удалится из памяти.
А если, например класс имеет др классы:
Код:

public class CBall extends СObject
{
    public var timer:Timer = new Timer(1000, 7);
   
}

родителем обнуляем экземпляр класса CBall, должен ли я при этом заранее обнулить ссылку члена класса timer (timer = null;), или же при обнулении экземпляра класса CBall, член timer обнуляется и удаляется из памяти автоматически?

dimarik 03.11.2009 23:24

Достаточно отписАться от него.

Denis_ex 04.11.2009 13:29

Достаточно отписАться от него. - не могли бы вы пояснить что значит "отписАться от него."

etc 04.11.2009 14:25

От его событий.

orcpochta 09.11.2009 18:55

Сейчас читаю Мука, немного запутался и у меня вот такой вопрос:
нужно ли перед удалением объекта отписываться от внутренних событий?
т.е. если есть внутренний объект stageDetector, в котором регистрируются приемники addedToStageListener и removedFromStageListener, нужно ли отписывать эти приемники перед удалением объекта?

Код:

package {
        import flash.display.*;
        import flash.ui.*;
        import flash.events.*;
        import flash.geom.*;
       
        public class CustomMousePointer extends Sprite {
                private var stageDetector:StageDetector;
               
                public function CustomMousePointer ( ) {
                        graphics.lineStyle(1);
                        graphics.beginFill(0x00FF00, 1);
                        graphics.lineTo(15, 5);
                        graphics.lineTo(5, 15);
                        graphics.lineTo(0, 0);
                        graphics.endFill( );
                       
                        stageDetector = new StageDetector(this);
                        stageDetector.addEventListener(StageDetector.ADDED_TO_STAGE, addedToStageListener);
                        stageDetector.addEventListener(StageDetector.REMOVED_FROM_STAGE, removedFromStageListener);

                }
               
                private function addedToStageListener (e:Event):void {
                        visible = false;
                       
                        Mouse.hide( );
                       
                        stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveListener);
                        stage.addEventListener(Event.MOUSE_LEAVE, mouseLeaveListener);
                }
               
                private function removedFromStageListener (e:Event):void {
                        trace(x + ", " + y);
                       
                        Mouse.show( );
                       
                        stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveListener);
                        stage.removeEventListener(Event.MOUSE_LEAVE, mouseLeaveListener);
                }
               
                private function mouseLeaveListener(e:Event):void {
                        visible = false;
                }
               
                private function mouseMoveListener (e:MouseEvent):void {
                        var pointInParent:Point = parent.globalToLocal(new Point(e.stageX, e.stageY));
                       
                        x = pointInParent.x;
                        y = pointInParent.y;
                                               
                        e.updateAfterEvent( );
                       
                        if (!visible) {
                                visible = true;
                        }
                }
               
                public function dispose ( ):void {
                        Mouse.show( );
                       
                        stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveListener);
                        stage.removeEventListener(Event.MOUSE_LEAVE, mouseLeaveListener);
                        stageDetector.removeEventListener(StageDetector.ADDED_TO_STAGE, addedToStageListener);
                        stageDetector.removeEventListener(StageDetector.REMOVED_FROM_STAGE, removedFromStageListener);

                }
        }
}

Код:

package {
        import flash.display.*;
       
        public class CustomMousePointerDemo extends Sprite {
                private var pointer:CustomMousePointer;
               
                public function CustomMousePointerDemo ( ) {                       
                        pointer = new CustomMousePointer( );
                        addChild(pointer);

                        //Удаление:
                      /*pointer.dispose( );
                          pointer = null;*/

                }
        }
}


mayakwd 10.11.2009 02:45

orcpochta,
мало того что нужно, еще и необходимо удалить stageDetector (если вы не будете его больше использовать) приравняв его к null;
об этом можно почитать тут

orcpochta 10.11.2009 13:07

Цитата:

Сообщение от mayakwd (Сообщение 864439)
orcpochta,
мало того что нужно, еще и необходимо удалить stageDetector (если вы не будете его больше использовать) приравняв его к null;
об этом можно почитать тут

точно, спасибо! да, в статье еще напоминают, что надо не забывать еще удалять из списка отображения

random13 10.11.2009 14:38

Код AS3:

this = null

своего рода самоубийство объекта)))


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

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