2011-11-14 12 views
8

Eventuali duplicati:
What's the difference between [NSNull null] and nil?
What are the differences between nil, NULL and [NSNULL nil]?alcune confusioni circa [NSNull null], nil

1.

id dicValue = [aDictionary objetForKey:@"aKey"]; 

if(dicValue != nil) 
{ 
    blablala... 
} 

o

2.

if(dicValue != [NSNull null]) 
{ 
    blablala... 
} 

dovrei scegliere il primo, o il secondo?

o quando si tratta in questo modo:

3.

if ([aDictionary objetForKey:@"aKey"] != nil) 

o

4.

if ([aDictionary objetForKey:@"aKey"] != [NSNull null]) 

e che cosa di nuovo?

1.2.3.4. che è corretto e raccomandato?

risposta

18

Direttamente dal Apple Documentation.
La classe NSNull definisce un oggetto Singleton che si utilizza per rappresentare valori nulli in situazioni in cui nil è proibito come valore (in genere in un oggetto di raccolta come un array o un dizionario).

NSNull *nullValue = [NSNull null]; 
NSArray *arrayWithNull = [NSArray arrayWithObject:nullValue]; 
NSLog(@"arrayWithNull: %@", arrayWithNull); 
// output: "arrayWithNull: (<null>)" 

È importante sottolineare che l'istanza NSNull è semanticamente differente da NO o falso questi rappresentano entrambi un valore logico; l'istanza NSNull rappresenta l'assenza di un valore. L'istanza NSNull è semanticamente equivalente a zero, tuttavia è anche importante apprezzare che non è uguale a zero. Per verificare un valore di oggetto nullo, è necessario effettuare un confronto diretto degli oggetti.

id aValue = [arrayWithNull objectAtIndex:0]; 
if (aValue == nil) { 
    NSLog(@"equals nil"); 
} else if (aValue == [NSNull null]) { 
    NSLog(@"equals NSNull instance"); 
    if ([aValue isEqual:nil]) { 
     NSLog(@"isEqual:nil"); 
    } 
} 
// output: "equals NSNull instance" 

E 'chiaro ora ??

+0

sorta di, grazie! – Patrick

+0

questo ha aiutato così tanto grazie! Stavo cercando operatori di confronto in tutto SO – Jake

0

In questo caso, è necessario utilizzare il primo; o meglio, una piccola variazione:

if (dicValue) { 
    // blablabla... 
} 

NSNull è da utilizzare quando si ha bisogno di un oggetto valido, ad esempio per l'utilizzo come chiave del dizionario, l'ingresso array o simili.

nil è uguale a (id)NULL; è generalmente inteso come "Nessun valore".

[NSNull null], d'altra parte, è un oggetto che contiene un valore vuoto; inteso come "Un valore di Nessuno".

Molto pochi metodi restituiscono un valore NSNull e in genere viene rilevato solo se lo si presenta.

Esiste principalmente perché nil non può essere inserito negli array; e funziona come un indicatore vuoto per gli array che lo richiedono.


Su una nota correlata; la parte "!= nil" della tua espressione è ridondante; qualsiasi puntatore valido a un oggetto restituisce true in un'espressione booleana e nil restituisce false.

+0

3q, so che è ridondante, ma mi piace ancora aggiungere "! = Nil" part.it rende il codice facile da leggere! La pensi così :) – Patrick

1

primo che significa che non v'è tale chiave, secondi mezzi che il valore di chiave è NSNull

+0

Questo è molto chiaro, 3q! – Patrick

3

mi risulta che NSNull è un oggetto che rappresenta un valore NULL e nil è solo un puntatore vuoto.

È possibile riempire un NSArray con oggetti NSNull e restituirà valori nulli, ma non è possibile riempirlo con nils.

Si può fare

[myNsMutableArray addObject:[NSNull null]]; 

ma questo potrebbe andare in crash:

[myNsMutableArray addObject:nil]; 

Allo stesso modo:

[[NSMutableArray alloc] initWithObjects:@"1", nil, @"2", nil]; 
[[NSMutableArray alloc] initWithObjects:@"1", [NSNull null], @"2", nil]; 

Il primo array, una volta stampata sarebbe uscita "1" Il secondo sarebbe uscita: "1, null, 2"

Quindi è possibile utilizzare NSNull per rappresentare spazi vuoti in un array.

Non è possibile inserire nil in un dizionario. Quindi controllarlo significa che la chiave non esiste. Se si controlla NSNull, significa che la chiave esiste ma contiene un valore vuoto (NSNull).

+0

3q, questo aiuta molto! – Patrick

+0

Sono contento che lo faccia. Accetta la risposta quindi :) – Odrakir

Problemi correlati