SORU
14 HAZİRAN 2009, Pazar


Nasıl bir NSArray ispat edebilirim?

Standart deyim için bir NSArray üzerinde yineleme için arıyorum. Benim kod OS X 10.4 için uygun olması gerekir .

CEVAP
14 HAZİRAN 2009, Pazar


Genellikle tercih edilen 10.5 /iOS için kod.

for (id object in array) {
    // do something with object
}

Bu [NSFastEnumeration protocol]uygun bir koleksiyon(Cocoa Reference) nesneleri sıralamak için kullanılır oluşturmak. Bu yaklaşım bir tampon birkaç nesne işaretçileri (tek bir yöntem çağrısı ile elde edilen) depolar ve arabellek işaretçi aritmetiği kullanarak ilerleyen aracılığı ile onların arasında dolaşır, çünkü bir hız avantajı vardır. Buçokdaha hızlı -objectAtIndex: her zaman aramaktan daha döngü.

Ayrıca değer ise teknik olarak kaydettiolabilirkullanmak için ** 6, bir adım için bir döngü bu hızlı sıralama hız avantajı hemen hemen hepsi kapatıldı. Nedeni varsayılan -countByEnumeratingWithState:objects:count: NSEnumerator Uygulama her çağrı tampon yalnızca bir nesne yerleştirir.

radar://6296108 Bu rapor (NSEnumerators Hızlı numaralandırma durgun) bir sorun olarak geri dönmüş. Nedeni hızlı sayım öncesi getirir bir grup nesneleri ve isterseniz enumerate sadece belli bir noktada numaralandırıcısı (örn kadar belirli bir nesne buldum, ya da koşulun yerine getirilip) ve aynı numaralandırıcısı sonra patlak döngü, değil mi sık sık olması durumunda çeşitli nesneler olurdu atlanır.

Eğer OS X 10.6 / iOS 4.0 ve üzeri kodlama, blok tabanlı numaralandırma diziler ve diğer koleksiyonları için API kullanma seçeneği vardır:

[array enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop) {
    // do something with object
}];

Ayrıca -enumerateObjectsWithOptions:usingBlock: kullanın ve pas NSEnumerationConcurrent ve/ya da seçenekleri değişken olarak NSEnumerationReverse.


10.4 veya öncesi

Pre-10.5 için standart deyim NSEnumerator ve bir süre bir döngü gibi kullanmak için

NSEnumerator *e = [array objectEnumerator];
id object;
while (object = [e nextObject]) {
  // do something with object
}

Basit tutmak tavsiye ederim. Dizi bir tür kendini ipe, esnek olmayan, -objectAtIndex: kullanarak sözde hızlı artış 10.5 hızlı numaralandırma ile iyileştirilmesi için önemsiz zaten. (Hızlı numaralandırma aslında temel veri yapısı üzerinde işaretçi aritmetiği kullanır ve havai yöntem çağrısı en kaldırır.) Erken optimizasyonu hiç iyi bir fikir değil — messier kodu darboğaz zaten olmayan bir sorunu çözmek için sonuçlar.

Kullanırken-objectEnumeratorsize çok kolay bir sayısız koleksiyon (NSDictionary, vb. bir ** 18, anahtarlar gibi), hatta geçin-reverseObjectEnumeratorbir dizi geriye doğru sıralamak için başka bir kod değişikliği ile. Eğer yineleme kodu bir yöntem ise, NSEnumerator herhangi bir geçirmek ve hatta kodu bile umurumda değilneyineleme. Ayrıca, bir NSEnumerator (en azından bu Apple tarafından sağlanan kod) korur koleksiyon numaralandırma sürece orada daha fazla nesne, bu yüzden endişelenme. ne kadar uzun bir autoreleased nesne var.

Belki de NSEnumerator (veya hızlı numaralandırma) dan koruyacak bir büyük şey değiştirilebilir bir koleksiyon (Dizi veya başka) seni içimde yaşıyorsizin haberiniz olmadanbu numaralandırma yaparken. Dizin nesneleri erişim, garip durumlar içine çalıştırabilirsiniz veya devre dışı-tarafından bir hata (uzun sorun ortaya çıktıktan sonra genellikle) hata ayıklama için korkunç olabilir. Numaralandırma birini kullanarak standart cümleler vardır bir "fail-fast" davranış sorunu (neden yanlış kod) kendini hemen çalıştığınızda access bir sonraki nesne sonra mutasyon oluştu. Program üçüncü taraf kodu değiştirebilir bir şey daha karmaşık ve çok iş parçacıklı, hatta bağlı olarak, kırılgan numaralandırma kodu giderek daha sorunlu hale gelir. Saklama ve soyutlama FTW! :-)


Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Damian Winter

    Damian Winte

    27 ŞUBAT 2007
  • Digital Bounds

    Digital Boun

    19 Temmuz 2013
  • OVERWERK

    OVERWERK

    6 Temmuz 2010