Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   TextField, созданный в IDE и утечка памяти (http://www.flasher.ru/forum/showthread.php?t=195671)

bookworm 11.03.2013 13:16

TextField, созданный в IDE и утечка памяти
 
Смотрю ссылки с помощью Dictionary (http://divillysausages.com/blog/trac...y_leaks_in_as3)

Подгружаю в главную SWF дочерний SWF с текстовым полем, созданным во FLA.

Если по нему не кликать - при выгрузке SWF , ссылка исчезает, как и должна.
А если кликнуть - остаётся.

При этом, если я загружу SWF заново, снова кликну по текстовому полю и выгружу SWF, старая ссылка пропадет, а новая останется. То есть - остается только последняя.

Никакие обработчики не вешаются.

Для динамически созданного textfield'а - тоже самое, если ему установить mouseEnabled = true

Что может быть? Дело в фокусе?

alatar 11.03.2013 14:10

Вполне возможно, что и в фокусе. Это легко проверить, посмотрев значение Stage#focus либо поменяв фокус перед выгрузкой.

Добавлено через 1 минуту
P.S. это не утечка памяти, т.к. объект в конце-концов освобождается и удаляется сборщиком мусора.

bookworm 11.03.2013 14:38

Цитата:

Сообщение от alatar (Сообщение 1124559)
P.S. это не утечка памяти, т.к. объект в конце-концов освобождается и удаляется сборщиком мусора.

Солгасен. Но вот какая штука. У меня SWF-ка, на которой находится это текстовое поле (TF), отжирает немало памяти большими подгруженными растрами.
Если TF динамическое, то я изымаю в дестроере его из дисплейлиста, зануляю ссылку и пусть себе висит.
А вот то текстовое поле, что создано во FLA, не получается удалить таким образом. И оно, вися, держит еще и весь объект SWF-ки в памяти.
Пока, как вы правильно отметили, не будет почищено. Но не ранее чем фокус уйдет в другое текстовое поле. А у меня по ходу программы между кликами в одном TF и другом может пройти немло времени...

Добавлено через 8 минут
Но вот добавление в дестроеер stage.focus = null не помогает.

Добавлено через 15 минут
Более того, если я после клика в текстовое поле, кликну на сцену - фокус снимается. А толку - нет. Всё равно в памяти остается.

Пока я вижу вариант, не использовать созданные в IDE текстовые поля. Тогда я могу в дестроеере дочерней SWF-ки убирать их из дисплейлиста.
Только странно, почему не получается тоже самое с созданными в IDE?

Добавлено через 1 час 26 минут
В итоге, два вопроса:
1. Что же такое держит в памяти textfield-ы, если не фокус?
2. Почему я никак не могу отцепить от SWF textfield, созданный во FLA, в то время как динамический - можно. При этом в обоих случаях они висят в памяти, пока не будет клика на каком-то другом текстовом поле, но динамический не держит вместе с собой всю SWF в памяти.

alatar 11.03.2013 16:11

Как вы загружаете swf?

bookworm 11.03.2013 16:59

Loader'ом. В отдельный ApplicationDomain.

alatar 11.03.2013 17:45

Возможно у вас нет доступа к управлению фокусом загруженного swf. Что содержит stage.focus родительской swf?

Цитата:

Почему я никак не могу отцепить от SWF textfield, созданный во FLA
Потому, что он является частью структуры swf.

bookworm 11.03.2013 18:01

Цитата:

Сообщение от alatar (Сообщение 1124624)
Возможно у вас нет доступа к управлению фокусом загруженного swf. Что содержит stage.focus родительской swf?.

Я вешал на таймер вывод stage.focus родительского SWF и при щелчке по текстовому полю дочернего вижу указатель на него, а при щелчке снаружи - опять null.
И всё равно... При этом, у меня в главной SWF организован механизм смены дочерних SWF по факту подгрузки. Т.е. главная (допустим, уже загрузив ранее дочернюю) загружает новую дочернюю. Та, после загрузки, подтаскивает всё что нужно (растр, конфиги и прочее) и дергает родительскую, что готова. Родительская при этом добавляет её в дисплейлист и убирает предыдущую. Затем делает анлоад предыдущей.
Так вот перед самым анлоадом и делает "расфокусировку". И кроме того, в дочерних есть метод-дестроер, который висит на событии анлоад. Там-то всё чистится и удаляется. Там тоже расфокус. Там я и удаляю динамические текстовые поля. При этом они всё равно висят в памяти (что видно по MemoryTracker-у), но не держат весь объект. А вот со "встроенными" такого не получается...


Цитата:

Сообщение от alatar (Сообщение 1124624)
Потому, что он является частью структуры swf.

Ага. Т.е. при вызове removeChild() для объекта из FLA происходит не совсем то же самое, что при вызове динамически созданного? И он поэтому хоть и пропадает со сцены, но продолжает держать в памяти весь объект SWF-ки? Хорошо.
Но чего они вообще висят?

P.S. В общем, буду проверять далее эти моменты. Только мне очень интересно - что держит текстовые поля?! Нигде, в различных рекомендациях по предотвращению утечек, не говорится об этом. Что делает клик на текстовом поле?! Даже на пустом.

Добавлено через 1 минуту
Попробую сделать "чистый пример", отдельно от всей архитектуры.

alatar 11.03.2013 18:10

Что за MemoryTracker?

Добавлено через 9 минут
Если этот, то он довольно примитивный и указывает только на проблему, а не на ее причину.

bookworm 11.03.2013 18:40

Да, он. Причину не вижу, но вижу по крайней мере, что за объект остался жить.
Первоначально выявилась проблема на графиках потребления памяти в MonsterDebugger.
Штатно после выгрузки дочерних swf память возвращается в исходное состояние.

P.S. Сейчас, на "чистом примере" мне не удаётся повторить "залипание" текстового поля. Значит это я что-то надерьмокодил :/

etc 11.03.2013 18:54

http://www.flasher.ru/forum/blog.php?b=627 как вариант.


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

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