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

Psycho Tiger 24.08.2010 16:58

Вообще то да)

bebop 24.08.2010 17:02

ну значит никаких проблем

gloomyBrain 24.08.2010 18:08

Цитата:

Не понимаю чего так расхваливать CASALib
Я и не хотел этого. Более того, прекрасно обхожусь без нее и ей подобных библиотек, ибо при нормальном подходе польза от нее сомнительная

Цитата:

Но все остальные переменные класса все равно ручками занулять в destroy нужно
Не обязательно. Как уже заметил Zebestov - если нет ссылки на сам объект, то нет и ссылок на его свойства.

Psycho Tiger 24.08.2010 18:18

Глум, я написал ведь. Если 2 объекта очень "сцепленны" может быть ситуация, в которой GC будет думать что ссылки на них остались.
Хотя, эту статью где про это рассказывалось читал очень давно. Может, сейчас дела обстоят лучше.

Zebestov 24.08.2010 18:26

Psycho Tiger, только что проверил.

Немного измененный пример gloomyBrain:

Код AS3:

package {
 
        /**
        * ...
        * @author gloomyBrain
        * @mail CartoonRaccoon@gmail.com
        */

 
        public class LinkHolder {
 
                private var _link:Object;
 
                public function LinkHolder() {
 
 
                }
 
                public function set link(link:Object):void
                {
                        this._link = link;
                }
 
                public function get link():Object {
                        return this._link;
                }
 
        }
 
}

при "перекрестном использовании":

Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
 
        public class Main extends Sprite
        {
                private var a:LinkHolder;
                private var b:LinkHolder;
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
 
                        this.a = new LinkHolder();
                        this.b = new LinkHolder();
 
                        this.a.link = this.b;
                        this.b.link = this.a;
 
                        stage.addEventListener(MouseEvent.CLICK, this.onClickHandler);
                }
 
                private function onClickHandler(e:MouseEvent):void
                {
                        this.a = null;
                        this.b = null;
                        // запускаем GC и наблюдаем исчезновение
                        // обоих экземпляров LinkHolder
                }
 
        }
 
}

не вызывает "зависания" экземпляров — GC разобрался =)

Psycho Tiger 24.08.2010 18:47

Нет, суть не в этом. Я очень упрощенно сказал, на самом деле ссылок должно быть очень много друг-на друга и желательно больше, чем в 2 объектах. То есть 5 связанных классов, каждый с которым связан, причем больше, чем одной ссылкой.

Короче, ужасный код должен быть)

Zebestov 24.08.2010 18:52

Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
 
        public class Main extends Sprite
        {
                private var a:LinkHolder;
                private var b:LinkHolder;
                private var c:LinkHolder;
                private var d:LinkHolder;
                private var e:LinkHolder;
                private var f:LinkHolder;
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
 
                        this.a = new LinkHolder();
                        this.b = new LinkHolder();
                        this.c = new LinkHolder();
                        this.d = new LinkHolder();
                        this.e = new LinkHolder();
                        this.f = new LinkHolder();
 
                        this.a.link = this.d;
                        this.b.link = this.c;
                        this.c.link = this.f;
                        this.d.link = this.b;
                        this.e.link = this.a;
                        this.f.link = this.e;
 
                        stage.addEventListener(MouseEvent.CLICK, this.onClickHandler);
                }
 
                private function onClickHandler(e:MouseEvent):void
                {
                        this.a = null;
                        this.b = null;
                        this.c = null;
                        this.d = null;
                        this.e = null;
                        this.f = null;
                        // запускаем GC и наблюдаем исчезновение
                        // всех 6 экземпляров LinkHolder
                }
 
        }
 
}

та шо ж такое =)

zuxul 24.08.2010 19:10

Алгоритму mark-and-sweep пофигу, что-есть перекрестные ссылки, хоть их мильён...
Только я вот не знаю, использует этот алгоритм флешплеер.

Psycho Tiger 24.08.2010 19:16

Zebestov, а чем этот код отличается от предыдущего? a никак не связан с f. b никак не связан с d и так далее. У всех по одной ссылке.

И я повторюсь - я сам этого дела не тестил, просто давным-давно читал в статье. Это вполне могли уже пофиксить. А может автор статьи вруша. Я лишь донёс мысль, по которой стоило бы писать деструкторы с занулением переменных. Хотя бы ради перестраховки.

Zebestov 24.08.2010 22:01

Есть такое...
Проверил для "все ссылаются на всех, включая себя" — GC непобедим =)


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

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