Показать сообщение отдельно
Старый 16.01.2013, 16:00
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 9  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
на все загрузчики были навешаны слушатели, и не weak, и все равно ГЦ их съедал.
Всё правильно, он не сьёдал бы их, только если бы слушатель принадлежал самому лоадеру и Вы бы повесили его слушатель на объект, который не подлежал бы сборке мусора.

А так вы навесили слушатель - т.е. добавили ссылку на себя в лоадер - как это должно помешать его сборке?

По порядку:
Код AS3:
private function stageMouseClickHandler(event:MouseEvent):void {
			var a:A = new A();
			addChild(a.vis);
}
1. Вы создали экземпляр A
2. Вы взяли у экземпляра A vis и добавили его в список отображения
3. Вы нигде не сохранили ссылку на сам экземпляр A (функция отработала - ссылок на экземпляр A не осталось, остался только vis в списке отображения)
Что должно получиться:
- ничего не мешает собрать GC экземпляр A
- GC не может собрать vis.
Код AS3:
public var vis:Sprite = new Sprite();
 
	private const _SHAPE:Shape = new Shape();
 
	function A() {
		vis.graphics.beginFill(0xFF0000);
		vis.graphics.drawRect(-25, -25, 50, 50);
		vis.graphics.endFill();
 
		_SHAPE.addEventListener(Event.ENTER_FRAME, entarFrameHandler);
	}
3. Вы вешаете слушатель не на vis, а на _SHAPE
4. _SHAPE на сцену не добавляется
5. на _SHAPE ссылается экземпляр A, на который вы не сохранили никаких ссылок
Что должно произойти:
- Экземпляр _SHAPE должен быть снесён сборщиком мусора

Вывод: Хороший пример, демонстрирующи работу GC и никакой мистики!


Последний раз редактировалось expl; 16.01.2013 в 16:19.