Objective-C: Qual è la differenza tra NULL, nil e @ “”?

Come dice il titolo, qual è la differenza tra NULL , nil e @"" ?

Ad esempio, se voglio verificare una stringa in un dizionario è vuota.

Quale condizione dovrei usare?

 if ([dictionary objectForKey:@"aString"] == nil) 

o

 if [[dictionary objectForKey:@"aString"] isEqualToString:@""] 

o

 if ([dictionary objectForKey:@"aString"] == NULL) 

Quale è giusto?

nil è l’analogo di NULL per gli oggetti objective-c. In realtà sono gli stessi:

  //MacTypes.h #define nil NULL 

Così

 if ([dictionary valueForKey:@"aString"]==nil) if ([dictionary valueForKey:@"aString"]==NULL) 

entrambi controllano se la chiave specifica è presente in un dizionario, sebbene la 1a riga sia più corretta in quanto controlla i tipi di obiettivi-c.

Di:

 if ([[dictionary valueForKey:@"aString"] isEqualToString:@""]) 

Questa riga controlla se c’è una voce nel dizionario con la chiave “aString” e confronta quella voce con una stringa vuota. Il risultato sarà uno dei seguenti:

  • è falso se non c’è una tale voce per la tua chiave
  • è vero se c’è una voce per la tua chiave e quella voce è una stringa vuota
  • potrebbe bloccarsi se esiste un object per la chiave e non risponde a -isEqualToString: messaggio

Quindi, in base alle proprie esigenze, è necessario utilizzare la prima riga oppure, se è necessario combinare entrambi, verificare se la voce esiste e non è una stringa vuota, quindi sono necessarie due condizioni:

 if ([dictionary valueForKey:@"aString"]==nil || [[dictionary valueForKey:@"aString"] isEqualToString:@""]) 
 nil == (id) 0 Nil == (Class) 0 NULL == (void *) 0 

@ “” è una costante NSString vuota.

nil è usato per rappresentare un puntatore nullo a un object Objective-C. Nil è usato per rappresentare un puntatore nullo a una class Objective-C. NULL è usato per rappresentare un puntatore nullo per qualsiasi altra cosa.

Tutti questi, hanno il valore numerico di 0. Sono tutti zero, ma “NULL” è un vuoto *, “nil” è un id e “Nil” è un puntatore di class.

@ “” è usato per denotare una stringa vuota, o per dire una stringa di lunghezza ZERO.

valueForKey: (e molti altri metodi Cocoa) restituisce un puntatore (indirizzo di memoria) a un object. Quando si utilizza il simbolo == si verifica semplicemente il valore numerico di quel puntatore e non il valore effettivo della stringa. Quando si utilizza isEqualToString: si sta verificando il valore.

Questi due:

 if ([dictionary valueForKey:@"aString"]==nil) if ([dictionary valueForKey:@"aString"]==NULL) 

sono più o meno equivalenti e entrambi test “L’indirizzo è stato restituito uguale a zero?”, che è come valueForKey: indica che non è stato trovato alcun object per quella chiave. Se il dizionario contiene oggetti per quella chiave, indipendentemente dal suo valore (ad es. Anche una stringa vuota), questa istruzione if restituisce false.

(Di solito usi la versione nil in Objective-C, come una convenzione di stile tanto quanto qualsiasi altra cosa)

Questo:

 if ([[dictionary valueForKey:@"aString"] isEqualToString:@""]) 

Verifica il valore effettivo della stringa per vedere se è una stringa di lunghezza zero. Se non c’è alcun object nel dizionario, restituirà false, poiché quando si chiama isEqualToString: (o quasi qualsiasi altro metodo) contro un puntatore nil si ottiene sempre zero o falso.

“La class NSNull definisce un object singleton che si usa per rappresentare valori nulli in situazioni in cui nil è proibito come valore (tipicamente in un object di raccolta come un array o un dizionario).” Puoi usare nil ovunque tu possa usare null. La differenza principale è che è ansible inviare messaggi a zero, quindi è ansible utilizzarlo in alcuni punti in cui non funziona nulla. In generale, usa solo zero. questo è esattamente ciò che sta accadendo, il programmatore sta scegliendo di mettere un object nullo nell’array dei controller, dove nil non è consentito come valore.

È più un riferimento contestuale in cui NULL è un puntatore a 0x0, nil è un object objective-c inesistente e Nil è una class objective-c inesistente, ma tecnicamente sono tutti solo 0. Inoltre, è NULL non null – null è in Java o C # ma non in Objective-C

o facilità i modi che dici

Sono tutti zero, ma “NULL” è un vuoto *, “nil” è un id e “Nil” è un puntatore di class.

Nil e NULL indicano la non esistenza
@ “” indica l’esistenza ed è vuoto