PDA

Просмотр полной версии : статические свойства классов


island
02.03.2007, 07:20
Есть, например, код:
class Trash {

public static var n:Number;

public function Trash() {};

public static function init() {
n = 100;
}
}
На рут кидаем текстфилд и обзываем его tf.
На основной временной шкале пишем:

_root.tf.text = Trash.n;
Trash.init();
Как и следует ожидать, выводится undefined. Но если запустить второй раз этот swf, не закрывая проигрыватель, то в tf.text будет 100. То есть статическое свойство присоединилось к _global и при повторном запуске в том же проигрывателе оно уже заранее инициализировано. Так вот это мне очень не нравится. Есть ли способ очищать _global от занесенных туда моих статических свойств? Заранее неизвестно какие там свойства и сколько их.

Tardos Mors
02.03.2007, 09:23
Дело в том, что при повторном проигрывании ролика уже созданные переменные никуда не деваются, и поэтому придется удалять их все в ручную. Есть простой способ - все содержимое _root запихать в мувик и чтобы начать проигрывание сначала перезагружать его.

island
02.03.2007, 09:59
В том то и дело, что статические свойства записываются не в рут, а "выше" - в глобал. Можно ли перегрузить глобал? :)
У меня есть набор классов, которые в зависимости от значений их статических свойств на момент инициализации ведут себя совершенно по-разному... Мне не хочется в них копаться, отлавливая где какие свойства используются, и каждый раз при запуске ролика сбрасывать все значения статических свойств. Хотелось бы сделать так, чтобы при повторном запуске ролика проигрыватель был бы девственно чист :mosking:

etc
02.03.2007, 10:40
Сделать стат. функцию initialize(), которая сбрасывает значения.

island
02.03.2007, 11:46
Сделать стат. функцию initialize(), которая сбрасывает значения.
Для этого мне нужно знать все используемые статические свойства... А если классов вагон, и в процессе работы над проектом будут добавляться другие классы, надо постоянно обновлять функцию initialize(). Интересует именно возможность "рестартнуть" плеер, или убедиться в отсутствии такого механизма.

etc
02.03.2007, 12:39
Сей баг наблюдается лишь при тестировании в IDE. Могу лишь посоветовать закрывать окно и делать тест по новой.

island
02.03.2007, 13:10
нет, я говорю про swf-файл, открываемый standalone флеш-плеером. А особенность проекта заключается в том, что флеш-плеер подгружается в экзшеник как компонент, а внутри уже рулит swf-ками... Так вот флеш-плеер подгружается один раз, и нет возможности его открывать-закрывать...

etc
02.03.2007, 14:03
У тебя класс находится в загружаемом swf?

island
02.03.2007, 15:53
да, класс находится в swf-ке... А разве можно по-другому - в готовую swf подгружать класс?

CorC
02.03.2007, 17:14
а import на что?

etc
02.03.2007, 20:50
Мммм, у тебя есть основной SWF и загружаемый в него, с классом? Или как?

island
05.03.2007, 07:27
Нетт... Вообще swf друг друга не подгружают. Их загружает плеер. В аттаче swf, с описания которой я начал эту тему. Его надо открыть флеш-плеером (не браузерным), затем в плеере выбрать file -> open и снова открыть эту же флешку. И можно будет заметить, что значение статической переменной осталось от предыдущего запуска.

etc
05.03.2007, 12:34
Гм, мысль только одна — грузить swf в другой swf, типа контейнер. Перед загрузкой снести класс Trash. (delete _global['Tra'+sh']; да-да, именно так).

Mr. Fixit
05.03.2007, 13:18
delete _global['Tra'+sh']
а почему именно так? =))

etc
05.03.2007, 13:22
Потому что нам не надо зашивать класс Trash в контейнер. Т.е. delete Trash не прокатит. А delete _global['Trash'] преобразуется в delete _global.Trash и тоже может зашить класс (хотя не проверял). Поэтому плюс и стоит.

iNils
05.03.2007, 14:33
Разницы между
delete _global['Tra'+'sh'];
и
delete _global.Trash;
никакой. В обоих случаях АС код преобразуется в один и тот же байткод:
push '_global'
getVariable
push 'Trash'
delete
pop

etc
05.03.2007, 14:45
Да? Точно. Тогда
var name:String = 'Trash';
delete _global[name];