Kapan saya harus menggunakan nil dan NULL di Objective-C?

170

Ini adalah kode contoh:

NSDictionary *myDictionary = [NSDictionary dictionary];
NSNumber *myNumber = [myDictionary valueForKey: @"MyNumber"];
NSLog(@"myNumber = %@", myNumber); // output myNumber = (null)

if (myNumber == nil)
    NSLog(@"test 1 myNumber == nil");

if (myNumber == NULL)
    NSLog(@"test 2 myNumber == NULL");

if ([myNumber isEqual:[NSNull null]])
    NSLog(@"test 3 myNumber == [NSNull null]");

Kapan saya harus menggunakan nil, NULL dan [NSNull null]?

Biranchi
sumber
4
Ini terkait dengan pertanyaan Objective C.
Biranchi
nilberarti semacam NULLuntuk instance objc. Jadi, Anda dapat menandai nilai spesifik yang dimaksudkan untuk instance objc atau penunjuk generik. Mengingat manajemen jenis dan keamanan, ini akan banyak membantu Anda.
eonil
4
nildan null/ NULLsama - keduanya didefinisikan sebagai nol. Sebagai formalitas, gunakan nilsaat coding Objective-C dan NULLketika coding pernyataan / panggilan C / C ++ biasa. NSNulladalah sesuatu yang sama sekali berbeda. Ini adalah objek tunggal yang berfungsi sebagai tempat-penampung untuk mewakili "tidak ada" di, misalnya, NSDictionary di mana nil / null pointer tidak diizinkan.
Hot Licks
Lihat tautan untuk penjelasan yang bagus [di sini] [1] [1]: stackoverflow.com/questions/5908936/…
Ameer
1
kemungkinan duplikat NULL vs nihil di Objective-C
awiebe 8'13

Jawaban:

114

Anda dapat menggunakan niltentang di mana saja Anda dapat menggunakan null. Perbedaan utama adalah bahwa Anda dapat mengirim pesan nil, sehingga Anda dapat menggunakannya di beberapa tempat di mana nulltidak dapat bekerja.

Secara umum, gunakan saja nil.

Alex
sumber
12
secara teknis, mereka persis sama, Anda dapat mengirim pesan ke nihil dan ke NULL. Secara idiomatis, nihil biasanya digunakan untuk merepresentasikan objek
cobbal
41
juga, di MacTypes.h ada#define nil NULL
cobbal
8
Ya, seperti kata cobbal, mereka sama. Ini lebih merupakan referensi kontekstual di mana NULL adalah pointer ke 0x0, nihil adalah objek objektif-c yang tidak ada dan Nil adalah kelas objektif-c yang tidak ada, tetapi secara teknis mereka semua hanya 0. Juga, itu adalah NULL bukan null - null ada di Java atau C # tetapi tidak di Objective-C.
Jason Coco
16
Jawaban yang diterima ini gagal untuk mengakui bahwa itu [NSNull null]adalah binatang yang sangat berbeda. Mengutip dari Referensi Kelas NSNull , "Kelas NSNull mendefinisikan objek tunggal yang digunakan untuk mewakili nilai null dalam objek koleksi (yang tidak memungkinkan nilai nil)." Juga lihat Menggunakan bagian NSNull dari Topik Pemrograman Angka dan Nilai.
Rob
"Perbedaan utama adalah Anda dapat mengirim pesan ke nol" - Anda juga dapat mengirim pesan NULL.
313

Mereka berbeda dalam tipenya. Semuanya nol, tetapi NULLadalah void *, niladalah id, dan Nilmerupakan penunjuk Kelas.

NSResponder
sumber
14
Penjelasan terbaik saya telah mendengar tentang perbedaan (: Terima kasih.
Jacob
3
Ini harus menjadi jawaban yang diterima, bukan karena ada lebih banyak suara, tetapi karena ia memiliki penjelasan terbaik untuk pertanyaan yang diajukan.
James Mertz
5
Deskripsi elegan NULLv nil, tapi ini sangat merindukan tanda [NSNull null]. Lihat Menggunakan bagian NSNull dari Topik Pemrograman Nilai dan Nilai dan Referensi Kelas NSNull .
Rob
Keduanya tampaknya menjadi petunjuk void *. Jawaban berbeda di sini sudah menyebutkan ini, tetapi jika Anda menggali objc.h, Anda akan menemukan garis #define nill __DARWIN_NULL.
gkb0986
1
Jawaban ini kedengarannya bagus tetapi menurut jawaban lain itu tidak benar.
n13
30

nil adalah nilai kosong yang terikat / sesuai dengan objek (tipe id di Objective-C). nil tidak punya referensi / alamat, hanya nilai kosong.

NSString *str = nil;

Jadi nihil harus digunakan, jika kita berurusan dengan suatu objek.

if(str==nil)
    NSLog("str is empty");

Sekarang NULL digunakan untuk pointer non-objek (seperti pointer C) di Objective-C. Seperti nihil , NULL tidak punya nilai atau alamat.

char *myChar = NULL;
struct MyStruct *dStruct = NULL;

Jadi jika ada situasi, ketika saya perlu memeriksa struct saya (variabel tipe struktur) kosong atau tidak, saya akan menggunakan:

if (dStruct == NULL)
    NSLog("The struct is empty");

Mari kita punya contoh lain, the

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

Dari pengamatan nilai-kunci , konteksnya harus berupa pointer C atau referensi objek. Di sini untuk konteksnya kita tidak bisa menggunakan nihil ; kita harus menggunakan NULL .

Akhirnya kelas NSNull mendefinisikan objek tunggal yang digunakan untuk mewakili nilai nol dalam objek koleksi (NSArray, NSDictionary). The [NSNull nol] akan kembali dengan tunggal contoh NSNull. Pada dasarnya [NSNull null] adalah objek yang tepat.

Tidak ada cara untuk memasukkan objek nil ke objek tipe koleksi. Mari kita punya contoh:

NSMutableArray *check = [[NSMutableArray alloc] init];
[check addObject:[NSNull null]];
[check addObject:nil];

Pada baris kedua, kita tidak akan mendapatkan kesalahan, karena sangat adil untuk memasukkan objek NSNull ke objek tipe koleksi. Pada baris ketiga, kita akan mendapatkan kesalahan "objek tidak boleh nol". Karena nihil bukan objek.

Shad
sumber
+1 untuk menyebutkan penggunaan praktis dari nil / null dalam array.
Michael
19

NULL dan nil adalah sama satu sama lain, tetapi nil adalah nilai objek sedangkan NULL adalah nilai pointer generik ( (void*)0, lebih spesifik). [NSNull null]adalah objek yang dimaksudkan untuk menggantikan nol dalam situasi di mana nol tidak diizinkan. Misalnya, Anda tidak dapat memiliki nilai nol dalam NSArray. Jadi, jika Anda perlu mewakili "nihil", Anda dapat menggunakannya [NSNull null].

Chuck
sumber
12

Saya telah menemukan yang berikut:

objc.h

#define Nil __DARWIN_NULL   /* id of Nil class */
#define nil __DARWIN_NULL   /* id of Nil instance */

_types.h

#define __DARWIN_NULL ((void *)0)

stddef.h

#undef NULL
#ifdef __cplusplus
#undef __null  // VC++ hack.
#define NULL __null
#else
#define NULL ((void*)0)
#endif

MacTypes.h

#ifndef NULL
#define NULL    __DARWIN_NULL
#endif /* ! NULL */
#ifndef nil
    #define nil NULL
#endif /* ! nil */

Dari tampilannya, tidak ada perbedaan selain konseptual.

Colnaghi
sumber
8

Waspadalah yang if([NSNull null])kembali true.

Nicolas Manzini
sumber
7

Keduanya hanya typecast nol. Secara fungsional, tidak ada perbedaan di antara mereka. yaitu.,

#define NULL ((void*)0)
#define nil ((id)0)

Ada perbedaan, tetapi hanya untuk Anda dan manusia lain yang membaca kode, kompiler tidak peduli.

Satu hal lagi nihil adalah nilai objek sedangkan NULL adalah nilai pointer generik.

Nirav
sumber
6

Dalam OSK OS X dan iOS modern:

  • nildan Nildan NULLidentik di Objective-C dan di Objective-C ++ sebelum C ++ 11.
  • nildan Nildan std::nullptridentik di Objective-C ++ dengan C ++ 11.

Secara gaya, banyak orang lebih suka menggunakan niluntuk objek Objective-C dan NULLatau nullptruntuk tipe pointer lainnya. Saya sendiri sekarang menggunakannya di nilmana-mana.

[NSNull null]adalah objek tunggal yang digunakan untuk mewakili nilai nol dalam situasi di mana nildilarang sebagai nilai (biasanya dalam objek koleksi seperti NSArrayatau NSDictionary). Topik Pemrograman Angka dan Nilai: Menggunakan NSNull

Greg Parker
sumber
5

Untuk memperluas komentar dari @cobbal:

MacTypes.h berisi:

#ifndef nil
   #define nil NULL
#endif
Justin Tanner
sumber
4

Seperti yang telah disebutkan, mereka sama, tetapi saya menggunakan yang satu atau yang lain tergantung pada bahasa di mana kerangka kerja yang sesuai ditulis.

Untuk semua yang berhubungan dengan Objective-C, saya menggunakan nihil. Sebagai contoh:

- (BOOL)doSomethingWithObjectsInArray:(NSArray *)anArray {
    if (anArray == nil) return NO;

    // process elements
    ...
}

Namun, ketika memeriksa validitas model data dari C-framework (seperti AddressBook framework dan CoreFoundation), saya menggunakan NULL. Sebagai contoh:

- (BOOL)showABUnknownPersonVCForABRecordRef:(ABRecordRef)aRecord {
    if (aRecord == NULL) return NO;

    // set-up the ABUnknownPersonViewController and display it on screen
    ..
}

Dengan cara ini, saya memiliki petunjuk halus dalam kode saya jika saya berurusan dengan kode berbasis Obj-C atau C.

Tafkadasoh
sumber
4

nil adalah pointer objek ke nol. Meskipun secara semantik berbeda dari NULL , secara teknis mereka setara satu sama lain.

Pada level framework, Foundation mendefinisikan NSNull , yang mendefinisikan metode kelas, + null, yang mengembalikan objek NSNull singleton. NSNull berbeda dari nil atau NULL , dalam hal ini adalah objek yang sebenarnya , bukan nilai nol.

Selain itu, di Foundation / NSObjCRuntime.h, Nil didefinisikan sebagai pointer kelas ke nol.

Lihat ini untuk info lebih lanjut - nil / Nil / NULL / NSNull

Shubham Jain
sumber
3

Ada perbedaan dalam beberapa konteks.

Secara harfiah, Null adalah karakter: ASCII 0.

Nil sama dengan kosong, tidak ada nilai.

Tergantung pada konteks pemrograman, ini bisa menjadi perbedaan besar.

Meatloaf
sumber
1

Gunakan NULL misalnya ketika Anda memanggil metode Objective-C dengan parameter tipe output (NSError **).

Saya melihat banyak contoh kode di web di mana orang memberikan nihil alih-alih NULL dalam kasus ini. Ini karena itu adalah pointer ke pointer dan dengan demikian tidak secara langsung tipe objek Objective-C. Seperti dikatakan di atas, nil harus digunakan untuk tipe objek Objective-C.

Peter Mortensen
sumber
1

Pada dasarnya: nil: null pointer pada objek dan null: adalah untuk pointer tipe lainnya

gerachev
sumber
0

nil berarti tidak adanya nilai sementara NULL mewakili No Object,

NSArray * array = @ [@ "Hello World!", @ 101, [NSNULL null]];

Di sini [NSNULL null] adalah objek yang berarti tidak ada objek, pada saat yang sama Anda tidak dapat menambahkan nol untuk menunjukkan tidak adanya objek.

Anda dapat menggunakan nil dan [NSNUll null] untuk memeriksa juga.

Roshan Sah
sumber
0

Ini akan membantu Anda memahami perbedaan antara nil, NIL dan null.

Tautan di bawah ini dapat membantu Anda dengan beberapa cara:

http://nshipster.com/nil/

nil -> nilai nol literal untuk objek Objective-C.

Nihil -> nilai nol literal untuk kelas Objective-C.

NULL -> nilai nol literal untuk pointer C.

NSNULL -> objek singleton digunakan untuk mewakili nol.

Subhakar Prabhu
sumber
apakah ini menambahkan sesuatu yang baru (yang tidak tercakup oleh jawaban yang ada)?
Florian Koch