NULL vs nil di Objective-C

182

Di observeValueForKeyPath:ofObject:change:context:- mengapa dokumen digunakan NULLalih-alih nilsaat tidak menentukan penunjuk konteks?

harga erik
sumber
menurut pendapat saya, objek adalah nihil, kelas adalah Nihil, dan NULL menggunakan untuk objek atau kelas
Thanh Vũ Trần

Jawaban:

227

nilseharusnya hanya digunakan sebagai pengganti id, apa yang akan kita pikirkan sebagai programmer Java dan C ++ sebagai pointer ke objek. Gunakan NULLuntuk pointer non-objek.

Lihatlah deklarasi metode itu:

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

Konteks adalah void *(yaitu pointer C-style), jadi Anda pasti akan menggunakan NULL(yang kadang-kadang dinyatakan sebagai (void *)0) daripada nil(yang bertipe id).

Paul Tomblin
sumber
2
Tapi karena jenis contextdi observeValueForKeyPath:ofObject:change:context:adalah void *, tidak itu berarti bahwa data yang diberikan sebagai contextbisa menjadi pointer objek? Saya pikir itu adalah kasus umum. Itu sebabnya saya bingung mengapa dokumen selalu menggunakan NULLbukan nil.
erikprice
2
Jenis konteks: dalam metode itu adalah "void *". "nil" bukan "void *", tetapi NULL adalah.
Paul Tomblin
3
Kamu bisa. void * adalah sembarang pointer. Meskipun demikian, Anda benar bahwa NULL adalah konstanta yang benar di sana.
Peter Hosey
3
Mereka berkata batal *. NULL untuk void * dan nil adalah untuk id. Karenanya, Anda lulus NULL. Jika Anda lulus nol, Anda berbohong kepada pembaca Anda, yang akan berpikir metode ini membutuhkan id.
Peter Hosey
12
Atau untuk memikirkannya dengan cara lain, NULL adalah tipe yang lebih luas, dan nihil adalah bagian dari NULL. Secara umum, gunakan tipe terluas yang bisa Anda hindari (yaitu di Jawa, tulis metode Anda untuk mengharapkan Koleksi alih-alih Vector, kecuali jika Anda memerlukan sesuatu yang spesifik dari Vector)
Paul Tomblin
65

Mereka secara teknis hal yang sama (0), tetapi nihil biasanya digunakan untuk tipe objek Objective-C, sementara NULL digunakan untuk pointer c-style (void *).

Marc Charbonneau
sumber
8
Juga, NULLberbeda dari nil. nildidefinisikan sebagai (id)0. NULLbukan.
14
@WTP jika Anda membaca MacTypes.h, ia menyatakan #define nil NULL
jbat100
1
Ini sangat menarik. Sepertinya itu tidak masalah selain dari untuk poin gaya. Ini seperti YA / BENAR dan TIDAK / SALAH.
Brennan
1
@ Briannan, Itu tidak sepenuhnya benar, hanya karena nil didefinisikan sebagai NULL tidak berarti ada beberapa implementasi tersembunyi di balik layar. Sebagai contoh, IBAction didefinisikan sebagai batal tetapi memiliki arti yang berbeda ketika menggunakan pembangun antarmuka ketika menampilkan metode untuk melampirkan tindakan pada tombol dan semacamnya.
Micaiah Wallace
53

Mereka secara teknis hal yang sama dan hanya berbeda dalam gaya:

  • Gaya Objective-C mengatakan nilapa yang harus digunakan untuk idtipe (dan pointer ke objek).
  • Gaya C mengatakan itulah NULLyang Anda gunakan untuk void *.
  • Gaya C ++ biasanya mengatakan bahwa Anda hanya harus menggunakan 0.

Saya biasanya menggunakan varian yang cocok dengan bahasa tempat tipe tersebut dideklarasikan .

Andrew
sumber
14

NULLadalah C equivalentof nil, sebuah pointer ke nothing;

di mana nil is zero typed as id,

NULL is zero typed as void*.

Satu poin penting Anda tidak dapat mengirim pesan ke NULL. Jadi lebih disukai menggunakan nihil di objektif-C di banyak tempat.


sumber
4

Mereka hampir merupakan hal yang sama kecuali,

nildigunakan dalam gaya Objective-C. di mana NULLuntuk pointer tipe C dan typdef'ed untuk (void *).

dan14941
sumber
1
Bukankah ini pengulangan dari jawaban yang ada ini ?
Pang