Quando devo usar nil e NULL em Objective-C?

Este é o código de amostra:

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]"); 

Quando devo usar nil, NULL e [NSNull null]?

Você pode usar nil sobre qualquer lugar que você possa usar null . A principal diferença é que você pode enviar mensagens para nil , então você pode usá-lo em alguns lugares onde null não pode trabalhar.

Em geral, use apenas nil .

Eles diferem em seus tipos. Eles são todos zero, mas NULL é um void * , nil é um id e Nil é um ponteiro de Classe.

nil é um valor vazio ligado / correspondente a um object (o tipo de id em Objective-C). nil não tem referência / endereço, apenas um valor vazio.

 NSString *str = nil; 

Então nil deve ser usado, se estamos lidando com um object.

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

Agora, o NULL é usado para o ponteiro não object (como um ponteiro C) em Objective-C. Como nulo , o NULL não tem valor nem endereço.

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

Então, se houver uma situação, quando eu precisar verificar minha struct (variável de tipo de estrutura) estiver vazia ou não, então usarei:

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

Vamos ter outro exemplo, o

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

Da observação de valor-chave , o contexto deve ser um ponteiro C ou uma referência de object. Aqui para o contexto não podemos usar nada ; temos que usar NULL .

Finalmente, a class NSNull define um object singleton usado para representar valores nulos em objects de coleção (NSArray, NSDictionary). O [NSNull null] retornará a instância singleton do NSNull. Basicamente [NSNull null] é um object adequado.

Não há como inserir um object nulo em um object de tipo de coleção. Vamos dar um exemplo:

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

Na segunda linha, não obteremos nenhum erro, porque é perfeitamente justo inserir um object NSNull em um object de tipo de coleção. Na terceira linha, obteremos o erro “object não pode ser nulo”. Porque nil não é um object.

NULL e nil são iguais entre si, mas nil é um valor de object, enquanto NULL é um valor de ponteiro genérico ( (void*)0 , para ser específico). [NSNull null] é um object que deve ser considerado nulo em situações em que nil não é permitido. Por exemplo, você não pode ter um valor nulo em um NSArray. Então, se você precisa representar um “nulo”, você pode usar [NSNull null] .

Eu encontrei o seguinte:

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 */ 

Do jeito que parece, não há diferença, a não ser conceitual.

Tenha em atenção que if([NSNull null]) devolve true .

Para expandir um comentário do @cobbal:

MacTypes.h contém:

 #ifndef nil #define nil NULL #endif 

Ambos são apenas um tipo de zero. Funcionalmente, não há diferença entre eles. ie.

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

Há uma diferença, mas apenas para você e outros humanos que lêem o código, o compilador não se importa.

Mais uma coisa nada é um valor de object, enquanto NULL é um valor de ponteiro genérico.

Nos SDKs modernos do OS X e do iOS:

  • nil e Nil e NULL são idênticos no Objective-C e no Objective-C ++ antes do C ++ 11.
  • nil e Nil e std::nullptr são idênticos em Objective-C ++ com C ++ 11.

Estilisticamente, muitas pessoas preferem usar nil para objects Objective-C e NULL ou nullptr para outros tipos de ponteiro. Eu mesmo agora uso nil todos os lugares.

[NSNull null] é um object singleton usado para representar valores nulos em situações em que nil é proibido como um valor (normalmente em um object de coleção como um NSArray ou NSDictionary ). Tópicos de programação de números e valores: usando o NSNull

Como já mencionado, eles são os mesmos, mas eu uso um ou outro, dependendo da linguagem em que o framework correspondente foi escrito.

Para tudo relacionado ao Objective-C, eu uso nulo. Por exemplo:

 - (BOOL)doSomethingWithObjectsInArray:(NSArray *)anArray { if (anArray == nil) return NO; // process elements ... } 

No entanto, ao verificar a validade dos modelos de dados de uma estrutura C (como a estrutura AddressBook e CoreFoundation), eu uso NULL. Por exemplo:

 - (BOOL)showABUnknownPersonVCForABRecordRef:(ABRecordRef)aRecord { if (aRecord == NULL) return NO; // set-up the ABUnknownPersonViewController and display it on screen .. } 

Desta forma, eu tenho pistas sutis no meu código se estou lidando com código baseado em Obj-C ou C.

Há uma diferença em alguns contextos.

Literalmente, Nulo é um caractere: ASCII 0.

Nada é equivalente a branco, sem valor.

Dependendo do contexto de programação, isso pode ser uma grande diferença.

Use NULL, por exemplo, quando você chamar um método Objective-C com um parâmetro de saída do tipo (NSError **).

Eu vejo muitos exemplos de código na web onde as pessoas fornecem nil em vez de NULL neste caso. Isso ocorre porque é um ponteiro para um ponteiro e, portanto, não diretamente para um tipo de object Objective-C. Como dito acima, nil deve ser usado para os tipos de object Objective-C.

nil significa ausência de valor enquanto NULL representa No Object,

NSArray * array = @ [@ “Hello World!”, @ 101, [NSNULL nulo]];

Aqui [NSNULL null] é um object que significa nenhum object, ao mesmo tempo você não pode adicionar nil para indicar ausência de object.

você pode usar nil e [NSNUll null] para checar também.

Isso ajudará você a entender a diferença entre nil, NIL e null.

O link abaixo pode ajudá-lo de alguma forma:

http://nshipster.com/nil/

nil -> valor nulo literal para objects Objective-C.

Nil -> valor nulo literal para classs Objective-C.

NULL -> valor nulo literal para pointers C.

NSNULL -> object singleton usado para representar nulo.

Basicamente: nil: ponteiro nulo em um object e null: é para outro tipo de ponteiro

nil é um ponteiro de object para nada. Embora semanticamente distintos de NULL , eles são tecnicamente equivalentes entre si.

No nível da estrutura, o Foundation define NSNull , que define um método de class, + null, que retorna o object NSNull singleton. NSNull é diferente de nulo ou NULL , pois é um object real , em vez de um valor zero.

Além disso, em Foundation / NSObjCRuntime.h, Nil é definido como um ponteiro de class para nada.

Consulte isto para mais informações – nil / Nil / NULL / NSNull