![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Dec 2010
Сообщений: 177
|
У функции eventTarget.addEventListener(EventType.EVENT_NAME, eventResponse, useCapture:Boolean, priority:int, weakReference:Boolean);
Есть параметр weakReference. Известно, что GС удаляет объект, если даже на него есть слабые ссылки. В данном случае, как бы, если забыл отписать слушатель, то не критично – GС это сделает за тебя! Меня интересует одно, может ли GС (в очередном внезапном проходе) удалить слушатель во время его работы или еще до того, как слушатель будет нужен? Т.е. как GС определяет нужен ли слушатель программе или нет? В каких случаях стоит делать слабую ссылку? |
|
|||||
|
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Как правило weakReference вообще не нужен. Если вы вешаете слушателя на локальную переменную,
то и она и слушатель будет собран. А если переменная в массиве или на уровне класса, так вот при любом случае слушатель не удалится. |
|
|||||
|
Регистрация: Dec 2010
Сообщений: 177
|
Если объект является членом класса, и на него повесили событие со слушателем (слабая ссылка), то почему слушатель не удалится при проходе GC?
Ранее, не пользовался слабыми ссылками, всегда в ручную следил за памятью и тестил профайлером. Но, мне стал интересен механизм удаления слабых ссылок. |
|
|||||
|
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
я не могу ответить грамотно, но представьте ситуацию, когда Вы сделали игру и в момент включения GC прошёл и все удалил. Мне кажется, что создатели вкладывали иной смысл в словосочетание "слабая ссылка".
Добавлено через 3 минуты Вот если сделать так, то пока будет существовать обьект, слушатель имеет на него ссылку и не удалится. Если удалить обьект, то ссылки не будет, но его не удастся удалить, пока на нем весит слушатель. Может я и не прав. 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 { } } } |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
"слабая" означает, что если нет других ссылок на объект, то и эта не считается.
Если GC найдет объект в памяти, на который нет других ссылок кроме слабых ссылок на его хэндлеры, хранящихся в чужих EventDispatcherах (что по сути означает всего-лишь, что объект кого-то слушал. Сам он, по сути, никому уже не нужен, это ему был нужен кто-то, кого он прослушивал. Но к нему уже никак не обратиться, кроме как вызвать его хэндлер. Хэндлер того, кого уже никто не знает и не помнит) — объект будет удален из памяти.
__________________
Reality.getBounds(this); |
![]() |
![]() |
Часовой пояс GMT +4, время: 03:19. |
|
|
« Предыдущая тема | Следующая тема » |
|
|