NULL vs nil di Objective-C


182

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


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).


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 *).


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 .


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.


4

Mereka hampir merupakan hal yang sama kecuali,

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


1
Bukankah ini pengulangan dari jawaban yang ada ini ?
Pang
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.