SORU
20 AĞUSTOS 2009, PERŞEMBE


Objective-C: kimlik ve void *arasındaki fark

id void * arasındaki fark nedir?

CEVAP
20 AĞUSTOS 2009, PERŞEMBE


void * "anlamına gelir rastgele bir parça o bir başvuru' yazılmamış/bilinmeyen içeriği ile hafıza"

id demek "bilinmeyen sınıf, tesadüfi bir başvuru Objective-C nesne"

Ek anlamsal farklılıklar vardır:

  • Tek veya GC GC Desteklenen modları altında, derleyici yayarlar 7 ** tip 6 ** ama tip başvurular için engelleri yazacak. Yapıları bildirirken, bu çok önemli bir fark olabilir. void *_superPrivateDoNotTouch; gibi ilan bugün ivan'ın _superPrivateDoNotTouch aslında bir nesne nesneleri erken hasat neden olur. Bunu yapma.

  • void * tür bir başvuru üzerinde bir yöntemi çağırmak için çalışırken derleyici bir uyarı kus.

  • id Bir tür üzerinde bir yöntemi çağırmak için çalışırken, yalnızca yöntemi çağrıldığını @interface bildirimleri derleyici tarafından görülen herhangi bir beyan edilmiş değilse uyarır.

Böylece, bir daha asla void * bir nesne olarak bakmalıdır. Benzer şekilde, bir id bir nesneyi ifade etmek için yazılan bir değişken kullanmaktan kaçınmalısınız. En belirgin sınıfı başvuru yazdığınız kullanabilirsiniz. Hatta NSObject * derleyici, en azından, başvuru karşı yöntem çağırmaları daha iyi doğrulama sağlayabilir çünkü daha iyi ** 16 yaşında daha.

void * yaygın ve geçerli kullanımı diğer bazı API geçtiğini belirten opak veri bir referans olarak.

NSArray sortedArrayUsingFunction: context: yöntemi deneyin:

- (NSArray *)sortedArrayUsingFunction:(NSInteger (*)(id, id, void *))comparator context:(void *)context;

Sıralama işlev olarak bildirilmiş olacaktır:

NSInteger mySortFunc(id left, id right, void *context) { ...; }

Bu durumda, NSArray sadece senin geçtiğin her ne yöntemle context bağımsız değişken context argüman olarak geçer. İşaretçi boyutlu veri opak bir parça olarak NSArray ile ilgili olduğunu, ve ne istersen için kullanabilirsiniz.

Dil kapatılması tür bir özelliği olmadan, bu fonksiyon ile bir veri yığını boyunca taşımak için tek yoldur. Örneğin; eğer istediğin mySortFunc() için Koşullu olarak büyük / küçük harf duyarlı veya büyük / küçük harf duyarlı, olsa da hala iş parçacığı için güvenli, olur pass-küçük harf duyarlı bir gösterge bağlamında, büyük olasılıkla döküm yolu çıkar.

Kırılgan ve hata eğilimli, ama tek yol.

Blok Bu Blok Snow Leopard (http://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/GCD_libdispatch_Ref.pdf) -- http://llvm.org/ Çınlama mevcuttur ve yaygındır C. için kilitler vardır çözmek.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ICON

    ICON

    19 EKİM 2011
  • Moto Journal

    Moto Journal

    28 Mayıs 2007
  • Pál Zoltán Illés

    Pál Zoltán

    30 NİSAN 2007