Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Создание объекта без ключевого слова var (http://www.flasher.ru/forum/showthread.php?t=158406)

S-ed 20.06.2011 14:46

Ну. Проверьте код.
У меня работает. На CS4 и CS5.

etc 20.06.2011 14:46

Цитата:

Сообщение от S-ed (Сообщение 1005050)
Ну. Проверьте код.
У меня работает. На CS4 и CS5.

Он работает, только демонстрации работы GC — нет.

S-ed 20.06.2011 16:12

Цитата:

мы будем получать Sprite 1 и Sprite 2 бесконечно
Цитата:

Он работает, только демонстрации работы GC — нет.
У меня Sprite 1 генерится бесконечно (ждал пару минут), а вот Sprite 2 пропадает через секунду-две (иногда висит 10, но это когда никаких программ не запущено). Или Вы хотите чтоб GC в консоль писал когда собирает?

Этот код удаляет ссылку через 5 секунд:
Код AS3:

var s1:Sprite = new Sprite();
var s2:Sprite = new Sprite();
s1.addEventListener(Event.ENTER_FRAME, enterFrameListener);
s2.addEventListener(Event.ENTER_FRAME, enterFrameListener);
s1.name = 'Sprite 1';
s2.name = 'Sprite 2';
 
var timer:Timer = new Timer(1,0);
timer.addEventListener(TimerEvent.TIMER, timerListener);
timer.start();
 
var timer2:Timer = new Timer(5000,1);
timer2.addEventListener(TimerEvent.TIMER, timerSwitch);
timer2.start();
 
function timerListener (e:TimerEvent):void
{
        new TextField();
}
 
function enterFrameListener( e:Event ):void
{
        trace(e.target.name, timer.currentCount, System.totalMemory);
}
 
function timerSwitch (e:TimerEvent):void
{
        s2 = null;
        trace('Removing Sprite 2, s2 =', s2);
}

Трейс:
Код:

Sprite 1 1166 27508736
Sprite 2 1166 27508736
Sprite 1 1176 27516928
Sprite 2 1176 27516928
Sprite 1 1184 27529216
Sprite 2 1184 27529216
Sprite 1 1194 27549696
Sprite 2 1194 27549696
Removing Sprite 2, s2 = null
Sprite 1 1204 27566080
Sprite 2 1204 27566080
Sprite 1 1214 27582464
Sprite 2 1214 27582464
Sprite 1 1224 27594752
Sprite 2 1224 27594752
Sprite 1 1234 27615232
Sprite 2 1234 27615232
Sprite 1 1243 27627520
Sprite 2 1243 27627520
Sprite 1 1253 27656192
Sprite 2 1253 27656192
Sprite 1 1263 27668480
Sprite 2 1263 27668480
Sprite 1 1273 27684864
Sprite 2 1273 27684864
Sprite 1 1283 27705344
Sprite 2 1283 27705344
Sprite 1 1293 27721728
Sprite 2 1293 27721728
Sprite 1 1302 27742208
Sprite 2 1302 27742208
Sprite 1 1312 27758592
Sprite 2 1312 27758592
Sprite 1 1322 27770880
Sprite 2 1322 27770880
Sprite 1 1332 27791360
Sprite 2 1332 27791360
Sprite 1 1342 27807744
Sprite 2 1342 27807744
Sprite 1 1352 27824128
Sprite 2 1352 27824128
Sprite 1 1361 27840512
Sprite 2 1361 27840512
Sprite 1 1371 27852800
Sprite 2 1371 27852800
Sprite 1 1381 27877376
Sprite 2 1381 27877376
Sprite 1 1391 27893760
Sprite 2 1391 27893760
Sprite 1 1401 27914240
Sprite 2 1401 27914240
Sprite 1 1411 27926528
Sprite 2 1411 27926528
Sprite 1 1421 27955200
Sprite 2 1421 27955200
Sprite 1 1430 27975680
Sprite 2 1430 27975680
Sprite 1 1440 27983872
Sprite 2 1440 27983872
Sprite 1 1450 28004352
Sprite 2 1450 28004352
Sprite 1 1460 28020736
Sprite 2 1460 28020736
Sprite 1 1470 28041216
Sprite 2 1470 28041216
Sprite 1 1480 28057600
Sprite 2 1480 28057600
Sprite 1 1489 28073984
Sprite 2 1489 28073984
Sprite 1 1499 28094464
Sprite 2 1499 28094464
Sprite 1 1509 28114944
Sprite 2 1509 28114944
Sprite 1 1519 28127232
Sprite 2 1519 28127232
Sprite 1 1529 28147712
Sprite 2 1529 28147712
Sprite 1 1539 28164096
Sprite 2 1539 28164096
Sprite 1 1547 28176384
Sprite 2 1547 28176384
Sprite 1 1557 28192768
Sprite 2 1557 28192768
Sprite 1 1567 28217344
Sprite 2 1567 28217344
Sprite 1 1577 28229632
Sprite 2 1577 28229632
Sprite 1 1587 28241920
Sprite 2 1587 28241920
Sprite 1 1596 27361280
Sprite 1 1605 27369472
Sprite 1 1614 27377664
Sprite 1 1624 27389952
Sprite 1 1634 27402240
Sprite 1 1644 27418624
Sprite 1 1654 27430912

Разумеется, трейс зависит от частоты кадров (при FPS 120, отставание 10%), и не передает ральные значения таймера.

gloomyBrain 20.06.2011 16:34

@S-ed
когда Вы делаете
Код AS3:

s1.addEventListener(Event.ENTER_FRAME, enterFrameListener);

Вы создаете у s1 ссылку на того, кому принадлежит метод enterFrameListener. То есть, s1 теперь уведомит кого-то, что у него (s1) произошло событие ENTER_FRAME и он (s1) вызовет у этого кого-то метод enterFrameListener и передаст в него соответствующий событийный объект.
Если бы мы написали вот так
Код AS3:

s1.addEventListener(Event.ENTER_FRAME, enterFrameListener, 123, true);

То владелец метода enterFrameListener может быть скушан GC, если на него нет никаких ссылок, кроме той самой, по которой s1 вызывает метод. К самому s1 это никакого отношения не имеет

etc 20.06.2011 16:47

S-ed, если ваш код скопипастить без изменений, никакого удаления Sprite 2 из памяти не будет. Если у вас вдруг пропал трейс с Sprite 2, при этом код не меняли — у вас битая память компьютера или кривой Flash Player.

S-ed 20.06.2011 16:56

gloomyBrain
Да, я знаю как это работает.
О, заодно вопрос, как защитить documentClass от сборки? На него как раз, как Вы сказали, нет ссылок...или он не собирается?

etc
Вот в том и дело, что у меня на 2х машинах "битая память". >_<

etc 20.06.2011 17:02

А, пардон, всё верно, GC работает, на s2 ссылок нет.

gloomyBrain 20.06.2011 17:16

Цитата:

или он не собирается
Ну, пока он есть в дисплей листе - нет, не собирается. Ведь его можно получить через getChildAt(). Это правило действует для всех, основной класс не является чем-то особенным

S-ed 20.06.2011 18:12

gloomyBrain
Понятно. У меня как раз его нет в дисплей листе (в том который проверял на GC).

А как его туда добавить? Ведь документКласс должен быть чайлдом чего-то...

dimarik 20.06.2011 21:43

Добавьте, addChild ) Jul 2001 это сильно!


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

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