Njective-nil vs Objective-C


182

İçinde observeValueForKeyPath:ofObject:change:context:- bir içerik işaretçisi belirtmemek NULLyerine dokümanlar neden kullanıyor nil?


bence, nesne nil, sınıf Nil ve NULL nesne veya sınıf için kullanılıyor
Thanh Vũ Trần

Yanıtlar:


227

nilyalnızca idJava ve C ++ programcılarının bir nesneye işaretçi olarak düşündükleri yerine kullanılmalıdır. NULLNesne olmayan işaretçiler için kullanın .

Bu yöntemin beyanına bakın:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
    change:(NSDictionary *)change context:(void *)context

Bağlam bir void *(yani bir C stili işaretçi) olduğundan , (tipte olan ) yerine kesinlikle NULL(bazen olarak bildirilir ) kullanırsınız.(void *)0nilid


2
Ancak, contextin türü observeValueForKeyPath:ofObject:change:context:olduğu için void *, bu, contextbir nesne işaretçisi olabileceği anlamına gelen bir veri değil mi? Bunun ortak bir durum olduğunu düşünürdüm. Ben dokümanlar hep kullanmak neden olarak karıştı sebebi bu NULLyerine nil.
erikprice

2
Bağlam türü: bu yöntemde "void *". "nil" bir "geçersiz *" değildir, ancak NULL'dir.
Paul Tomblin

3
Yapabilirsin. void * herhangi bir göstericidir. Yine de, NULL'un orada doğru sabit olduğu konusunda kesinlikle haklısınız.
Peter Hosey

3
Boşluk dediler *. NULL, void * içindir ve nil id içindir. Bu nedenle, NULL iletirsiniz. Nil'den geçerseniz, bu yöntemin bir kimlik aldığını düşünecek olan okuyucunuza yalan söylersiniz.
Peter Hosey

12
Ya da başka bir şekilde düşünmek için, NULL daha geniş bir türdür ve nil NULL bir alt kümesidir. Genel olarak, uzaklaşabileceğiniz en geniş türü kullanın (örn. Java'da,
Vector'den

65

Teknik olarak aynı şeydir (0), ancak nil genellikle bir Objective-C nesne türü için kullanılırken, NULL c-tarzı işaretçiler için kullanılır (void *).


8
Ayrıca, NULLfarklı tanımlanır nil. nilolarak tanımlanır (id)0. NULLdeğil.

14
@ WTP MacTypes.h üzerinden okursanız, #define nil NULL
jbat100 27:11

1
Bu çok ilginç. Stil noktalarından başka önemli değil gibi görünüyor. EVET / DOĞRU ve HAYIR / YANLIŞ gibi.
Brennan

1
@Brennan, Bu tamamen doğru değil, çünkü nil'in NULL olarak tanımlanması, sahne arkasında başka gizli uygulamalar olduğu anlamına gelmez. Örneğin, IBAction, void olarak tanımlanır, ancak düğmelerdeki eylemlere ekleme yöntemleri görüntülerken arayüz oluşturucu kullanılırken farklı bir anlama sahiptir.
Micaiah Wallace

53

Teknik olarak aynı şeydir ve sadece tarz olarak farklıdırlar:

  • Objective-C stili yazı (ve nesnelere işaretçiler) niliçin ne kullanacağını söylüyor id.
  • C stili, bunun NULLiçin kullandığınızı söylüyor void *.
  • C ++ stili genellikle kullanmanız gerektiğini söyler 0.

Genellikle tür bildirilen dil ile eşleşen varyant kullanın .


14

NULLolduğu C equivalentbirnil şey bir işaretçi;

nerede nil is zero typed as id,

NULL is zero typed as void*.

Önemli bir nokta NULL'a mesaj gönderemezsiniz. Bu nedenle birçok yerde obj-C'de nil kullanılması tercih edilir.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.