Просмотр полной версии : Расходование памяти
Забивается память или нет?
Есть 3 ф-ии в статическом классе
В первой SetInterval'ом обращаемся ко второй
Во второй очищаем его и обращаемся SetInterval'ом к третьей
В третьей очищаем его и снова обращаемся к первой функции
public static var intervalTimerChangeBanner: Number;
public static function initTimerChangeBanner (): Void {
intervalTimerChangeBanner = setInterval (function () : Void {
timerChangeBanner ();
}, 1000)
}
public static function timerChangeBanner (): Void {
if (что-то ) {
clearInterval(intervalTimerChangeBanner);
...
intervalTimerChangeBanner = setInterval (function () : Void {
timerLoadBanner ();
}, 300)
}
}
public static function timerLoadBanner (): Void {
if ( что-то) {
clearInterval(intervalTimerChangeBanner);
initTimerChangeBanner ();
}
}
Забивается память или нет?
Твой класс, ты и должен ответить на этот вопрос. Если я скопирую класс ради теста, он у меня:
а) не заработает;
б) даже если заработает, показывать он ничего не будет.
Меня интересует в общем при таком подходе стек очищается от третьей функции или забивается?
Нет, к сожалению, времени для прогона тестов, но я бы для начала переписал код:
class Example {
public static var intervalTimerChangeBanner:Number;
public static function initTimerChangeBanner():Void {
Example.intervalTimerChangeBanner = setInterval(Example,'timerChangeBanner', 1000);
}
public static function timerChangeBanner():Void {
if (что-то) {
clearInterval(Example.intervalTimerChangeBanner);
…
Example.intervalTimerChangeBanner = setInterval(Example,'timerLoadBanner', 300);
}
}
public static function timerLoadBanner():Void {
if (что-то) {
clearInterval(Example.intervalTimerChangeBanner);
Example.initTimerChangeBanner ();
}
}
}
если требуется вызов интервала единожды, то лучше сделать специальный метод setTimer, в котором прописать самоочистку:
class MyClass {
private static function setTimer (delay:Number, callback:Function, args:Array):Void {
var interval:Number = setInterval(
function () {
clearInterval(interval);
callback.apply(MyClass, args);
}, delay || 0
);
}
..........................
}в этом раскладе ты гарантирован от неприятной ошибки: если интервал задан, то он обязательно очистится.
тогда твой код метод initTimerChangeBanner будет выглядеть вот так:
public static function initTimerChangeBanner (): Void {
setTimer (1000, timerChangeBanner);
}ну и так далее...
а память забиваться не будет. не беспокойся.
Учитывая, что в AS3 уже документированы setTimeout/clearTimeout, то логично предположить, что данные методы недокументированные для 8-го плеера, будут описаны для него в флеш 9.
да здесь это обычный пользовательский метод.
никакого хака.
никакого хака.
Объявление функции внутри метода таким образом, имхо, плохо.
- в таком случае, создание одного объекта в другом объекте тоже плохо.
я думаю, что плохо, когда втыкается огромная функция, с которой попросту неудобно в таком случае работать.
а на паре строк особо не пострадает ни читабельность, ни юзабилити ни анбаггити :).
меня гораздо больше напрягает перспектива передавать имена методов стрингой.
имея ввиду: 'timerChangeBanner'.
Ну шо ж поделать, это setInterval.
Arsentev
09.03.2007, 01:59
Я, конечно, не говорю, что это лучший выход, и уж тем более продуктивный, но можно использовать аналогичные классы для всех случаев жизни:
class Timer{
private var _id : Number;
private var _interval : Number = 1000;
private var _active : Boolean = false;
public var _loop : Boolean = true;
public function get id():Number { return(this._id) }
public function set interval(_value:Number):Void {
if (not isNaN(_value)){
this._interval=_value;
if (this._active){ this.Reload() }
}
}
public function get interval():Number { return this._interval }
public function set active(_value:Boolean):Void {
if (_value){ this.StartTimer() } else { this.StopTimer() }
}
public function get active():Boolean { return this._active }
public function onTimer(){}
private function onUpdate(){
this.onTimer();
if (not this._loop) { this.StopTimer(); }
}
private function StopTimer():Void {
this._active=false;
clearInterval(this._id);
}
private function StartTimer():Void {
this._active=true;
clearInterval(this._id);
this._id = setInterval(this,"onUpdate",this._interval);
}
public function Reload():Void {
this.StopTimer();
this.StartTimer();
}
function Timer(val_interval, val_active) {
this._interval=val_interval;
if (val_active) { this.StartTimer() }
}
}
Использование:
var T:Timer = new Timer(300, true);
T.loop = false;
T.onTimer = function (){
//делать что-то
}
PS. За простоту не ругайте (написал за 15 минут:rolleyes:), зато функционально, а loop параметр можно заделать числовым, и назначать количество повторяемых раз.
А почему у вас имена методов похожи на имена классов?
Arsentev
09.03.2007, 02:15
Главное ошибок нет, а такие названия - мой стиль написания. Кому не нравится может исправить :)
Нет, есть общепринятые стандарты. Если вы показываете и даете использовать код, то он должен удовлетворять хотя бы какому-нибудь общепризнанному стандарту, а не собственному стилю написания.
Arsentev
09.03.2007, 02:20
А ссылочку можно на стандарты, а то куда ни глянь - у всех по разному, вот и приходится писать по-своему, зато везде одинаково
Ну например:
http://www.adobe.com/devnet/flash/articles/as_bestpractices_02.html
http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html
Зачем ссылку, я и так скажу:
Имена классов пишут с БольшойБуквы, а имена методов и свойств с маленькойБуквы. КОНСТАНТЫ_ПИШУТ_ТАК.
Arsentev
09.03.2007, 02:29
Усвоил
CCCPirate
09.03.2007, 02:37
никак не могу себя заставить писать имена методов с маленькой)))
Arsentev
09.03.2007, 02:43
никак не могу себя заставить писать имена методов с маленькой)))
Это ещё пол беды, я за 5 лет не научился писать комментарии на русском языке всё время лень клаву переключать:rolleyes:
CCCPirate
09.03.2007, 03:01
Я комментарии вообще не пишу: мозг должен тренироваться разгребать код - и что самое интересное тренировки дают положительный результат.)))
никак не могу себя заставить писать имена методов с маленькой)))Удали клавишы шифт и капслок :)
CCCPirate
09.03.2007, 03:04
Удали клавишы шифт и капслок :)
Ты б еще пальцы на левой руке удалить посоветовал.:)
Ладно, пофлеймовали и хватит.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.