İlişkilendirilebilir diziler

Flash Player 9 ve üstü, Adobe AIR 1.0 ve üstü

Bazen karma veya eşleme olarak da adlandırılan ilişkilendirilebilir bir dizi, saklanan değerleri organize etmek için sayısal bir dizin yerine anahtarları kullanır. İlişkilendirilebilir bir dizideki her anahtar, saklanan değere erişmek için kullanılan benzersiz bir dizedir. İlişkilendirilebilir bir dizi, Object sınıfının bir örneği olup bu, her anahtarın bir özellik adına karşılık geldiği anlamına gelir. İlişkilendirilebilir diziler, anahtar ve değer çiftlerinin sıralanmamış koleksiyonlarıdır. Kodunuzun belirli bir sırada olması için ilişkilendirilebilir dizinin anahtarlarını beklememesi gerekir.

ActionScript 3.0, sözlük adında gelişmiş bir ilişkilendirilebilir dizi türünü de içerir. flash.utils paketinde Dictionary sınıfının örnekleri olan sözlükler, herhangi bir veri türündeki anahtarları kullanır. Başka bir deyişle, sözlük anahtarları, String türünün değerleriyle sınırlı değildir.

Dize anahtarları ile ilişkilendirilebilir diziler

ActionScript 3.0'da ilişkilendirilebilir dizi oluşturmanın iki yolu vardır. Birinci yol, Object örneği kullanılmasıdır. Object örneği kullanarak, bir nesne değişmeziyle dizinizi başlatabilirsiniz. Object sınıfının genel nesne olarak da adlandırılan bir örneği, ilişkilendirilebilir bir diziyle aynı işleve sahiptir. Genel nesnenin özellik adlarının her biri, saklanan değere erişilmesini sağlayan bir anahtar görevi görür.

Aşağıdaki örnek iki anahtar ve değer çiftiyle diziyi başlatmak için bir nesne değişmezi kullanan monitorInfo adında ilişkilendirilebilir bir dizi oluşturur:

var monitorInfo:Object = {type:"Flat Panel", resolution:"1600 x 1200"}; 
trace(monitorInfo["type"], monitorInfo["resolution"]);  
// output: Flat Panel 1600 x 1200

Bildirim zamanında diziyi başlatmanız gerekmiyorsa, diziyi oluşturmak için Object yapıcısını şu şekilde kullanabilirsiniz:

var monitorInfo:Object = new Object();

Bir nesne değişmezi veya Object sınıfı yapıcısı kullanılarak dizi oluşturulduktan sonra, dizi erişimi ([]) operatörünü veya nokta operatörünü (.) kullanarak diziye yeni değerler ekleyebilirsiniz. Aşağıdaki örnek monitorArray öğesine iki yeni değer ekler:

monitorInfo["aspect ratio"] = "16:10"; // bad form, do not use spaces 
monitorInfo.colors = "16.7 million"; 
trace(monitorInfo["aspect ratio"], monitorInfo.colors); 
// output: 16:10 16.7 million

aspect ratio adındaki anahtarın bir boşluk karakteri içerdiğini unutmayın. Bu, dizi erişimi ([]) operatörüyle mümkün olsa da, nokta operatörüyle denendiğinde hataya yol açar. Anahtar adlarınızda boşluk kullanılması önerilmez.

İlişkilendirilebilir bir dizi oluşturmanın ikinci yolu, Array yapıcısı (veya herhangi bir dinamik sınıf yapıcısı) kullanıldıktan sonra diziye anahtar ve değer çiftleri eklemek için dizi erişimi ([]) operatörünün veya nokta operatörünün (.) kullanılmasıdır. İlişkilendirilebilir dizinizin Array türünde olmasını bildirirseniz, diziyi başlatmak için bir nesne değişmezi kullanamazsınız. Aşağıdaki örnek, Array yapıcısını kullanarak monitorInfo adında ilişkilendirilebilir bir dizi oluşturur ve type adında bir anahtar ile resolution adında bir anahtarı değerleriyle birlikte ekler:

var monitorInfo:Array = new Array(); 
monitorInfo["type"] = "Flat Panel"; 
monitorInfo["resolution"] = "1600 x 1200"; 
trace(monitorInfo["type"], monitorInfo["resolution"]);  
// output: Flat Panel 1600 x 1200

İlişkilendirilebilir bir dizi oluşturmak için Array yapıcısının kullanılması herhangi bir avantaj sağlamaz. Array yapıcısını veya Array veri türünü kullanıyor olsanız da, ilişkilendirilebilir dizilerle Array.length özelliğini veya Array sınıfı yöntemlerinden herhangi birini kullanamazsınız. Dizinlenmiş diziler oluşturmanın en iyi yolu Array yapıcısının kullanılmasıdır.

Nesne anahtarları ile ilişkilendirilebilir diziler (Sözlükler)

Anahtarlar için dize yerine nesne kullanan ilişkilendirilebilir bir dizi oluşturmak üzere Dictionary sınıfını kullanabilirsiniz. Bu diziler bazen sözlük, karma veya eşleme olarak adlandırılır. Örneğin, belirli bir konteynerle ilişkisini esas alarak bir Sprite nesnesinin konumunu belirleyen bir uygulamayı göz önünde bulundurun. Sprite nesnelerinin her birini bir konteynere eşlemek için Dictionary nesnesini kullanabilirsiniz.

Aşağıdaki kod, Dictionary nesnesi için anahtar görevi gören üç Sprite sınıfı örneği oluşturur. Her anahtara GroupA veya GroupB değeri atanır. Değerler herhangi bir veri türünde olabilir ancak bu örnekte hem GroupA hem de GroupB Object sınıfının örnekleridir. Daha sonra, aşağıdaki kodda gösterildiği gibi, dizi erişimi ([]) operatörü ile anahtarların her biriyle ilişkilendirilmiş değere erişebilirsiniz:

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");  
}

Nesne anahtarlarıyla yineleme

for..in döngüsü veya for each..in döngüsü ile Dictionary nesnesinin içeriklerini yineleyebilirsiniz. for..in döngüsü, anahtarları esas alarak yineleme yapmanızı sağlarken, for each..in döngüsü, her bir anahtarla ilişkilendirilmiş değerleri esas alarak yineleme yapmanıza olanak sağlar.

Dictionary nesnesinin nesne anahtarlarına doğrudan erişmek için for..in döngüsünü kullanın. Dizi erişimi ([]) operatörüyle Dictionary nesnesinin değerlerine de erişebilirsiniz. Aşağıdaki kod önceki groupMap sözlüğü örneğini kullanarak, for..in döngüsü ile Dictionary nesnesinin nasıl yinelendiğini gösterir:

for (var key:Object in groupMap) 
{ 
    trace(key, groupMap[key]); 
} 
/* output: 
[object Sprite] [object Object] 
[object Sprite] [object Object] 
[object Sprite] [object Object] 
*/

Dictionary nesnesinin değerlerine doğrudan erişmek için for each..in döngüsünü kullanın. Aşağıdaki kod, ayrıca groupMap sözlüğünü kullanarak, for each..in döngüsü ile Dictionary nesnesinin nasıl yinelendiğini gösterir:

for each (var item:Object in groupMap) 
{ 
    trace(item); 
} 
/* output: 
[object Object] 
[object Object] 
[object Object] 
*/

Nesne anahtarları ve bellek yönetimi

Adobe® Flash® Player ve Adobe® AIR™, artık kullanılmayan belleği kurtarmak için bir çöp toplama sistemi kullanır. Bir nesne kendisini işaret eden bir başvuru içermiyorsa, nesne çöp toplama için uygun hale gelmiş demektir ve çöp toplama sistemi tekrar çalıştırıldığında bellek kurtarılır. Örneğin, aşağıdaki kod yeni bir nesne oluşturur ve o nesnenin başvurusunu myObject değişkenine atar:

var myObject:Object = new Object();

Nesneyi işaret eden bir başvuru olduğu sürece, çöp toplama sistemi nesnenin kapladığı belleği kurtarmaz. myObject değeri, farklı bir nesneyi işaret edecek şekilde değiştirilirse veya null değerine ayarlanırsa, yalnızca orijinal nesneyi işaret eden başka bir başvuru olmaması durumunda orijinal nesnenin kapladığı bellek çöp toplama işlemi için uygun hale gelir.

myObject öğesini Dictionary nesnesinde bir anahtar olarak kullanırsanız, orijinal nesneyi işaret eden başka bir başvuru oluşturuyor olursunuz. Örneğin, şu kod, myObject değişkeni ve myMap nesnesindeki anahtar olmak üzere bir nesneye iki başvuru oluşturur:

import flash.utils.Dictionary; 
 
var myObject:Object = new Object(); 
var myMap:Dictionary = new Dictionary(); 
myMap[myObject] = "foo";

myObject tarafından başvurulan nesneyi çöp toplama işlemi için uygun hale getirmek istiyorsanız, bu nesneyi işaret eden tüm başvuruları kaldırmanız gerekir. Bu durumda, aşağıdaki kodda gösterildiği gibi, myObject öğesinin değerini değiştirmeniz ve myMap öğesinden myObject anahtarını silmeniz gerekir:

myObject = null; 
delete myMap[myObject];

Alternatif olarak, tüm sözlük anahtarlarını zayıf başvurular haline getirmek için, Dictionary öğesinin useWeakReference parametresini kullanabilirsiniz. Çöp toplama sistemi, zayıf başvuruları yok sayar, başka bir deyişle, yalnızca zayıf başvurular içeren bir nesne de çöp toplama işlemi için uygundur. Örneğin, aşağıdaki kodda nesneyi çöp toplama işlemi için uygun hale getirmek üzere myMap öğesinden myObject anahtarını silmeniz gerekmez:

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.