Форум 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)

Denis_ex 02.11.2009 22:46

Деструктор класса
 
Есть класс:
Код:

public class CBall extends СObject
{
    public var timer:Timer = new Timer(1000, 7);
    public var indBomb:uint = 0;
    .....
    public function Destroy():void
    {
        timer = null; // здесь норм.
        this = null; // здесь выдается ошибка: 1050: Cannot assign to a non-reference value.
    }
}


Т.е. чтобы удалить экземпляр класса из памяти нужно обнулить ссылку, сборщик мусора соберет данные, которые находятся без ссылки. Но, как мне внутри функции класса удалить данный класс из памяти?

scarbo 02.11.2009 22:55

никак, надо удалять экземпляр класса, в AS3.0 не реализованы деструкторы, в отличии к примеру от PHP5

Denis_ex 02.11.2009 23:32

Мне скорее нужно узнать, как обнулить ссылку экземпляра функцией внутри класса.

Felicast 03.11.2009 00:07

this = null; - это бред

incoob 03.11.2009 02:16

А в каких языках можно сделать
Код:

this = null;
?

alatar 03.11.2009 05:18

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

etc 03.11.2009 09:29

Цитата:

Сообщение от Denis_ex (Сообщение 862975)
как обнулить ссылку экземпляра функцией внутри класса.

Никак.

dimarik 03.11.2009 10:45

Подведем итог. Объект сам себя удалить не может =)

Vogd 03.11.2009 11:25

Ну почему же?

Код AS3:

this.parent.removeChild(this);

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

switcher! 03.11.2009 11:29

Цитата:

Сообщение от Vogd (Сообщение 863028)
Код AS3:

this.parent.removeChild(this);

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

удаление объекта из списка детей/списка_отображения не есть удаление самого объекта.

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, время: 12:07.

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