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

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

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

Регистрация: Dec 2010
Сообщений: 177
Post Удаление GC слабой ссылки weakReference

У функции eventTarget.addEventListener(EventType.EVENT_NAME, eventResponse, useCapture:Boolean, priority:int, weakReference:Boolean);

Есть параметр weakReference.

Известно, что GС удаляет объект, если даже на него есть слабые ссылки.

В данном случае, как бы, если забыл отписать слушатель, то не критично – GС это сделает за тебя!

Меня интересует одно, может ли GС (в очередном внезапном проходе) удалить слушатель во время его работы или еще до того, как слушатель будет нужен? Т.е. как GС определяет нужен ли слушатель программе или нет? В каких случаях стоит делать слабую ссылку?

Старый 19.10.2013, 21:26
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 2  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Как правило weakReference вообще не нужен. Если вы вешаете слушателя на локальную переменную,
то и она и слушатель будет собран. А если переменная в массиве или на уровне класса, так вот
при любом случае слушатель не удалится.

Старый 19.10.2013, 21:36
Alexmody вне форума Посмотреть профиль Отправить личное сообщение для Alexmody Найти все сообщения от Alexmody
  № 3  
Ответить с цитированием
Alexmody

Регистрация: Dec 2010
Сообщений: 177
Если объект является членом класса, и на него повесили событие со слушателем (слабая ссылка), то почему слушатель не удалится при проходе GC?

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

Старый 19.10.2013, 21:50
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 4  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
я не могу ответить грамотно, но представьте ситуацию, когда Вы сделали игру и в момент включения GC прошёл и все удалил. Мне кажется, что создатели вкладывали иной смысл в словосочетание "слабая ссылка".

Добавлено через 3 минуты
Вот если сделать так, то пока будет существовать обьект, слушатель имеет на него ссылку и не удалится. Если удалить обьект, то ссылки не будет, но его не удастся удалить, пока на нем весит слушатель.
Может я и не прав.
Код AS3:
package
{
	import flash.display.Sprite;
	import flash.events.Event;
	public class NewClass 
	{
		private var _sprite:Sprite;
 
		public function NewClass() 
		{
			_sprite = new Sprite();
			_sprite.addEventListener(Event.ACTIVATE, sprite_activateHandler,false,0,true);
		}
 
		private function sprite_activateHandler(event:Event):void 
		{
 
		}
 
	}
 
}

Старый 20.10.2013, 01:06
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 5  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
"слабая" означает, что если нет других ссылок на объект, то и эта не считается.
Если GC найдет объект в памяти, на который нет других ссылок кроме слабых ссылок на его хэндлеры, хранящихся в чужих EventDispatcherах (что по сути означает всего-лишь, что объект кого-то слушал. Сам он, по сути, никому уже не нужен, это ему был нужен кто-то, кого он прослушивал. Но к нему уже никак не обратиться, кроме как вызвать его хэндлер. Хэндлер того, кого уже никто не знает и не помнит) — объект будет удален из памяти.
__________________
Reality.getBounds(this);

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

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

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


 


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


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