вторник, 12 февраля 2008 г.

Прочитать 100 раз и запомнить. Слабые ссылки

На форуме miramax коротко и ясно описал что такое weakReference
Прочитать и запомнить:

GC удаляет только те объекты, к которым нельзя добраться из точки входа (основного объекта программы, Document Class, функция main как хотите называйте).
Например есть стуктура:

А (точка входа)
/ \
Б В
|
Г
/ \
Д Е

Если в какой-то момент убить ссылку из Б в Г, то будут удалены и Г, и Д, и Е. Т.е. если из точки входа невозможно провести путь к объекту, то он будет удалён, т.к. такой объект не может быть использован в основном потоке исполнения(который запускается в точке входа) даже теоретически =).

Некоторые классы используют так называемые "мягкие ссылки", которые не учитываются при обходе GC. Путь из точки входа к ним провести можно, но это не повлияет на GC/

Например тот же Dictionary, если ссылка на объект определена только в нём, и свойство Dictionary.weakReference = true. То объект будет удалён.

Ещё пример - метод
EventDispatcher.addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
В евент диспатчере как бы инкапсулированы ссылки на все обработчики, но
если последний аргумент true, то при обходе GC они не будут учитываться. Т.е. если на событие подписан метод объекта, на который нет других ссылок. Объект будет всё равно удалён.

Комментариев нет: