Форум 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)

Волгоградец 16.01.2013 17:12

Да, с первым понятно, спасибо. Повторю - я не знал, что ГЦ убивает объект, но трогает его поля.
Но как быть со вторым примером (пост 5).

dimarik 16.01.2013 17:38

Там то же самое. Ссылка на A гибнет в конструкторе Main. Для A#s листенер объявлен со слабой ссылкой, которая является последней зацепкой за GC Root. Финал понятен.

Добавлено через 1 минуту
"s" как раз будет жить, гибнет A.

Волгоградец 16.01.2013 18:11

Гибнет А и получается, что хэндлер вместе с ним. Такое возможно? Ведь на хэндлер ссылается A#s. И пускай ссылка слабая, сам же A#s то живой.

dimarik 16.01.2013 18:24

A#s живой, верно. Но на A есть только одна ссылка через метод enterFrameHandler. Он добавлен во внутренний список хендлеров объекта Sprite (s). Хендлер добавлен слабой ссылкой. Это значит, что если нет ни одной твердой ссылки на объект A, ссылка на него через enterFrameHandler не препятствует сборщику удалить этот самый A.

Волгоградец 16.01.2013 18:40

Цитата:

Это значит, что если нет ни одной твердой ссылки на объект A
С тем, что А убивается коллектором я уже смирился. Но хэндлер повешен не на А. Почему этот хэндлер то убивается?

iflamberg 16.01.2013 19:27

Так а почему бы ему не убиться, если он weak?

Волгоградец 16.01.2013 22:13

Ну так он же в дисплей листе ). Блин запутанно как то все...

dimarik 16.01.2013 22:23

Цитата:

Сообщение от Волгоградец (Сообщение 1115983)
С тем, что А убивается коллектором я уже смирился. Но хэндлер повешен не на А. Почему этот хэндлер то убивается?

Хэндлер (метод enterFrameHandler) убиться без его хозяина (объекта типа A) не может в принципе. Он является полем объекта и разлучить его с объектом мы не в состоянии. Нельзя просто так сделать delete enterFrameHandler. Убивается А, а вместе с ним и его метод enterFrameHandler. Как вы думаете, если нет объекта, может ли быть вызван его метод?

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

Так вроде как метод - это Function - обычный объект, наследник Object. Убился А, хозяин s, но сам то s жив, потому что на него ссылка в дисплей листе. Но ведь и на enterFrameHandler есть ссылка из s, в конце концов s и enterFrameHandler связаны... И раз уж enterFrameHandler - это обычный объект, то он то почему должен убиваться?

dimarik 17.01.2013 11:39

Чтобы объект убился необходимо чтобы не осталось на него ни одной ссылки. Еще раз...
Объект удаляется, если на него, на него, на него нет ссылок.
Считайте ссылки на объект A:
1. В конструкторе создается локальная ссылка. При выходе из него она умирает.
2. У s есть на него мягкая ссылка через enterFrameHandler. Она не играет роли при подсчете ссылок на объект.
Все. Коллектор удалит этот объект. Вы извините меня, но я уже не знаю как проще рассказать.


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

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