Можно использовать класс Dictionary для создания ассоциативного массива, использующего в качестве ключей объекты, а не строки. Такие массивы иногда называют словарями, хеш-таблицами или преобразованиями. Например, рассмотрим приложение, определяющее расположение объекта Sprite на основании его связи с определенным контейнером. Можно использовать объект Dictionary, чтобы сопоставить каждый объект Sprite с контейнером.
В примере ниже создаются три экземпляра класса Sprite, которые служат ключами для объекта Dictionary. Каждому ключу задается значение GroupA или GroupB. Значения могут быть любого типа данных, но в этом примере и GroupA, и GroupB являются экземплярами класса Object. Следовательно, доступ к значениям, связанным с каждым из ключей с оператором доступа к массиву ([]), осуществляется способом, показанным ниже:
import flash.display.Sprite;
import flash.utils.Dictionary;
var groupMap:Dictionary = new Dictionary();
// objects to use as keys
var spr1:Sprite = new Sprite();
var spr2:Sprite = new Sprite();
var spr3:Sprite = new Sprite();
// objects to use as values
var groupA:Object = new Object();
var groupB:Object = new Object();
// Create new key-value pairs in dictionary.
groupMap[spr1] = groupA;
groupMap[spr2] = groupB;
groupMap[spr3] = groupB;
if (groupMap[spr1] == groupA)
{
trace("spr1 is in groupA");
}
if (groupMap[spr2] == groupB)
{
trace("spr2 is in groupB");
}
if (groupMap[spr3] == groupB)
{
trace("spr3 is in groupB");
}
Итерации с объектами-ключами
Можно выполнять итерацию в объекте Dictionary с помощью цикла for..in или for each..in. Цикл for..in позволяет выполнять итерацию на основе ключей, а цикл for each..in — на основе значений, связанных с ключами.
Используйте цикл for..in для прямого доступа к объектам-ключам объекта Dictionary. Доступ к значениям объекта Dictionary возможен и без оператора доступа к массиву ([]). В приведенном ниже коде словарь groupMap из предыдущего примера используется для выполнения итерации в объекте Dictionary с помощью цикла for..in:
for (var key:Object in groupMap)
{
trace(key, groupMap[key]);
}
/* output:
[object Sprite] [object Object]
[object Sprite] [object Object]
[object Sprite] [object Object]
*/
Используйте цикл for each..in для прямого доступа к значениям объекта Dictionary. В приведенном ниже коде словарь groupMap используется для выполнения итерации в объекте Dictionary с помощью цикла for each..in:
for each (var item:Object in groupMap)
{
trace(item);
}
/* output:
[object Object]
[object Object]
[object Object]
*/
Объекты-ключи и управление памятью
Проигрыватель Adobe® Flash® Player и среда Adobe® AIR™ используют систему сборки мусора для восстановления памяти, которая больше не используется. Когда на объект не ведет ни одна ссылка, он становится кандидатом на сборку в мусор, поэтому при следующей сборке мусора занимаемая им память высвобождается. Например, в приведенном ниже коде создается новый объект, а переменной myObject назначается ссылка на объект:
var myObject:Object = new Object();
Покуда на объект указывает хотя бы одна ссылка, сборщик мусора не будет высвобождать занимаемую им память. Если значение myObject меняется и теперь указывает на другой объект или становится null, то память, занимаемая исходным объектом, подлежит сборке в мусор, но лишь в том случае, если на исходный объект не ведут другие ссылки.
Если myObject используется как ключ в объекте Dictionary, создается еще одна ссылка на исходный объект. Например, в приведенном ниже коде создаются две ссылки на объект — переменную myObject и ключ в объекте myMap:
import flash.utils.Dictionary;
var myObject:Object = new Object();
var myMap:Dictionary = new Dictionary();
myMap[myObject] = "foo";
Чтобы объект, на который ссылается myObject, мог быть собран в мусор, необходимо удалить все ссылки на него. В этом случае нужно изменить значение myObject и удалить ключ myObject из myMap, как показано ниже:
myObject = null;
delete myMap[myObject];
Вы также можете использовать параметр useWeakReference конструктора Dictionary, чтобы превратить все ключи словаря в слабые ссылки. Сборщик мусора игнорирует слабые ссылки, т. е. объект, на который ведут только слабые ссылки, подлежит сборке в мусор. Например, в приведенном ниже коде не нужно удалять ключ myObject из myMap, чтобы объект можно было собрать в мусор:
import flash.utils.Dictionary;
var myObject:Object = new Object();
var myMap:Dictionary = new Dictionary(true);
myMap[myObject] = "foo";
myObject = null; // Make object eligible for garbage collection.