Можно использовать класс 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.