Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 05.09.2012, 10:32
rs7 вне форума Посмотреть профиль Отправить личное сообщение для rs7 Найти все сообщения от rs7
  № 1  
Ответить с цитированием
rs7
 
Аватар для rs7

Регистрация: Jun 2009
Сообщений: 56
Question Анонимная функция и сборщик мусора

Объясните, пжлст, почему анонимная функция в приведённом примере не подвергается сборке мусора.
FP дебажный.

Просто изучаю, в производстве не использую

Код AS3:
package {
 
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.TimerEvent;
	import flash.system.System;
	import flash.utils.Timer;
 
	public class Main extends Sprite {
 
		public function Main():void {
 
			addEventListener(Event.ADDED_TO_STAGE, function (event:Event):void {
				trace("addedToStage");
 
				var timer:Timer = new Timer(500);
				timer.addEventListener(TimerEvent.TIMER, tick, false, 0, true);
				timer.start();
 
				event.currentTarget.removeEventListener(event.type, arguments.callee);
			});
		}
 
		private var i:int = 1;
 
		private function tick(event:Event = null):void {
			trace("tick", i);
 
			if (!(i++%5)) {
				trace("gc");
 
				System.gc();
			}
		}
 
	}
 
}
Цитата:
addedToStage
tick 1
tick 2
tick 3
tick 4
tick 5
gc
tick 6
tick 7
tick 8
tick 9
tick 10
gc
tick 11
tick 12
tick 13
tick 14

//и так далее

Старый 05.09.2012, 10:45
Silicium вне форума Посмотреть профиль Отправить личное сообщение для Silicium Найти все сообщения от Silicium
  № 2  
Ответить с цитированием
Silicium
 
Аватар для Silicium

Регистрация: Sep 2010
Адрес: Ростов-на-Дону
Сообщений: 369
Анонимная ф-ция здесь только обработчик добавления на сцену, которая вызывается один раз и в которой таймеру вешается обработчик (не анонимный) и запускается таймер. Где связь между вашим трейсом и тем утверждением, что gc не собрал анонимную ф-цию?

Старый 05.09.2012, 10:50
rs7 вне форума Посмотреть профиль Отправить личное сообщение для rs7 Найти все сообщения от rs7
  № 3  
Ответить с цитированием
rs7
 
Аватар для rs7

Регистрация: Jun 2009
Сообщений: 56
Объект timer - локальная переменная для анонимного обработчика. Если существует он, то существует и функция. Я не прав?

Старый 05.09.2012, 11:15
Aquahawk вне форума Посмотреть профиль Отправить личное сообщение для Aquahawk Посетить домашнюю страницу Aquahawk Найти все сообщения от Aquahawk
  № 4  
Ответить с цитированием
Aquahawk
 
Аватар для Aquahawk

Регистрация: Nov 2010
Адрес: Москва
Сообщений: 915
Записей в блоге: 4
Отправить сообщение для Aquahawk с помощью ICQ Отправить сообщение для Aquahawk с помощью Skype™
В корне не правы.
Все переменные создаются в куче, на стеке ничего не создаётся. Вы запросили у среды таймер (через new) а потом результат, ссылку на него, положили к себе в локальную переменную. Когда выполнение функции завершилось локальные переменные были уничтожены. Т.к. вы отписались, а вы вроде отписались, то ссылок ни на таймер ни на анонимную функцию не осталось. И функция скорее всего была уничтожена. Но тикающий таймер тикает сам по себе и не будет удалён пока тикает.
А вообще анонимные функции это зло. Используйте нормальные.
__________________
:)

Старый 05.09.2012, 11:22
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 5  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Таймер вообще всегда надо явно останавливать. Иначе его никто не удалит.
__________________
Hell is the possibility of sanity

Старый 05.09.2012, 12:14
rs7 вне форума Посмотреть профиль Отправить личное сообщение для rs7 Найти все сообщения от rs7
  № 6  
Ответить с цитированием
rs7
 
Аватар для rs7

Регистрация: Jun 2009
Сообщений: 56
Спасибо за разъяснения
Не знал, что Timer такой особенный.

В таком случае, подскажите, как можно проверить собралась ли анонимная функция коллектором?

Старый 05.09.2012, 13:57
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 7  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Ну, для таких вещей вобщем-то и придумали профилировщик. Для уверенности - создайте несколько тысяч, и смотрите как будут себя вести, чтобы случайно не перепутать с какими-нибудь другими функциями.
__________________
Hell is the possibility of sanity

Создать новую тему Ответ Часовой пояс GMT +4, время: 10:23.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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