Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Сборщик мусора. Удаляется объект, который в дисплей листе. (http://www.flasher.ru/forum/showthread.php?t=192575)

Волгоградец 17.01.2013 12:46

Цитата:

2. У s есть на него мягкая ссылка через enterFrameHandler. Она не играет роли при подсчете ссылок на объект.
Вы мне вот это объясните:
1. У s есть ссылка не на A, а на enterFrameHandler. A и enterFrameHandler - это разные объекты. Да, enterFrameHandler является приватным методом A, но тем не менее, это разные объекты, правильно я понимаю?
2. Вы утверждаете, что при удалении А, удалится и его метод enterFrameHandler (хоть он и связан с s), так?
3. Но s не удалится при удалении A, потому что он в дисплей листе, правильно?

dimarik 17.01.2013 13:00

A = enterFrameHandler в данном случае. Поэтому у s есть слабая ссылка на A.

Волгоградец 17.01.2013 13:03

Если это действительно так, то все становится на свои места. Хотя это специфическая инфа, которую я не встречал. Спасибо.

dimarik 17.01.2013 13:08

"A" ссылается на enterFrameHandler. enterFrameHandler ссылается на "A". Но на enterFrameHandler не ссылается никто из имеющих GC Root. Приходим к тому, что на "А" нет ссылок. "A" молча уходит со своими методами.

Волгоградец 17.01.2013 13:17

Вас опять не понятно. Вот эта строчка
Код AS3:

s.addEventListener(Event.ENTER_FRAME, enterFrameHandler, false, 0, true);

говорит, что на enterFrameHandler ссылается s. weak reference = true говорит о том, что enterFrameHandler будет срабатывать до тех пор, пока жив s. Или я опять туплю - когда мы вызываем addEventListener, мы связываем s и А, так что ли???

P.S.: не подумайте, что я тролль. Мне нужно докопаться до истины и сложить паззл у себя в голове.

expl 17.01.2013 13:40

Цитата:

Или я опять туплю - когда мы вызываем addEventListener, мы связываем s и А, так что ли???
Если говорить без мягких ссылок:

a.addEventListener("typeOfEvent", b.handler)
-теперь a ссылается на метод b
-b _не_ ссылается на a
-эта связь помешает удалению b из памяти, когда на b не останется других ссылок
-эта связь никак не помешает удалению a из памяти

Если с мягкими ссылками - то "a ссылается на метод b" перестаёт учитыватся GC вот и всё.

GC удаляет объект, когда на него не осталось внешних ссылок (ссылок из дисплей-листа, ссылок из статических полей классов, и т.д.)

Ссылки от объектов, которые сами подлежат удалению GC не считаются. Что такое Объекты, которые подлежат удалению? - это объекты на которые нет ссылок объектов, _не_ подлежащих удалению.
"Чтобы понять рекурсию надо понять рекурсию" :)

dimarik 17.01.2013 13:43

Stage (GCRoot) --> внутренний список детей --> [object Sprite] --> внутренний список хендлеров -x-> (enterFrameHandler --> [object A])

--> — обычная ссылка.
-x-> — мягкая ссылка.

maxkar 17.01.2013 14:56

Цитата:

Сообщение от Волгоградец (Сообщение 1116178)
weak reference = true говорит о том, что enterFrameHandler будет срабатывать до тех пор, пока жив s.

Нет! Никакого отношения к s эта строчка не имеет. Она обозначает, что слушатель будет срабатывать до тех пор, пока живсам слушатель (а не прослушиваемый объект)! Не s (объект, на котором слушают), а метод, который слушает. При этом GC связь между s и listener не учитывает, т.е. он не считает, что s использует enterFrameHandler и может собирать функцию (и объект), если на них нет других ссылок.

Волгоградец 17.01.2013 15:56

Все ясно. Всем спасибо.


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

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