Este é um código de exemplo:
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 nulo, NULL e [NSNull null]?
objective-c
null
nsnull
Biranchi
fonte
fonte
nil
significa um tipo deNULL
instância objc. Assim, você pode marcar que um valor específico se destina a instância objc ou ponteiro genérico. Em vista do gerenciamento e segurança do tipo, isso o ajudará muito.nil
enull
/NULL
são os mesmos - ambos definidos como zero. Como formalidade, usenil
ao codificar Objective-C eNULL
ao codificar declarações / chamadas regulares em C / C ++.NSNull
é algo totalmente diferente, no entanto. É um objeto singleton que serve como um espaço reservado para representar "nada" em, por exemplo, NSDictionarys onde indicadores nulos / nulos não são permitidos.Respostas:
Você pode usar
nil
em qualquer lugar que possa usarnull
. A principal diferença é que você pode enviar mensagens paranil
, para que você possa usá-lo em alguns lugares ondenull
não é possível trabalhar.Em geral, basta usar
nil
.fonte
#define nil NULL
[NSNull null]
é uma fera muito diferente. Para citar a Referência da classe NSNull , "A classe NSNull define um objeto singleton usado para representar valores nulos em objetos de coleção (que não permitem valores nulos)". Consulte também a seção Usando o NSNull dos Tópicos de programaçãoNULL
.Eles diferem em seus tipos. Eles são todos zero, mas
NULL
é umvoid *
,nil
é umid
eNil
é um ponteiro de Classe.fonte
NULL
vnil
, mas isso erra seriamente a marca re[NSNull null]
. Consulte a seção Usando o NSNull de Tópicos de programação de número e valor e Referência de classe do NSNull .void *
. Uma resposta diferente aqui já menciona isso, mas se você se aprofundarobjc.h
, encontrará a linha#define nill __DARWIN_NULL
.nil é um valor vazio vinculado / correspondente a um objeto (o tipo de ID em Objective-C). nulo não tem referência / endereço, apenas um valor vazio.
Portanto, nada deve ser usado, se estivermos lidando com um objeto.
Agora NULL é usado para ponteiro não-objeto (como um ponteiro C) em Objective-C. Como nulo , NULL não tem valor nem endereço.
Portanto, se houver uma situação, quando eu precisar verificar se minha struct (variável de tipo de estrutura) está vazia ou não, usarei:
Vamos dar outro exemplo, o
Da observação do valor-chave , o contexto deve ser um ponteiro C ou uma referência a objeto. Aqui, para o contexto, não podemos usar nada ; nós temos que usar NULL .
Finalmente, a classe NSNull define um objeto singleton usado para representar valores nulos em objetos de coleção (NSArray, NSDictionary). O [NSNull null] retornará a instância singleton do NSNull. Basicamente [NSNull null] é um objeto adequado.
Não há como inserir um objeto nulo em um objeto do tipo coleção. Vamos dar um exemplo:
Na segunda linha, não obteremos nenhum erro, porque é perfeitamente justo inserir um objeto NSNull em um objeto do tipo coleção. Na terceira linha, obteremos o erro "o objeto não pode ser nulo". Porque nulo não é um objeto.
fonte
NULL e nil são iguais entre si, mas nil é um valor de objeto enquanto NULL é um valor genérico de ponteiro (
(void*)0
, para ser específico).[NSNull null]
é um objeto destinado a substituir nada em situações em que nada é permitido. Por exemplo, você não pode ter um valor nulo em um NSArray. Portanto, se você precisar representar um "zero", poderá usar[NSNull null]
.fonte
Encontrei o seguinte:
objc.h
_types.h
stddef.h
MacTypes.h
Do jeito que parece, não há diferença, a não ser conceitual.
fonte
Cuidado com o
if([NSNull null])
retornotrue
.fonte
Ambos são apenas zero de zero. Funcionalmente, não há diferença entre eles. ie.,
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 nil é um valor de objeto, enquanto NULL é um valor genérico de ponteiro.
fonte
Nos modernos OS X e iOS SDKs:
nil
eNil
eNULL
são idênticos em Objective-C e em Objective-C ++ antes C ++ 11.nil
eNil
estd::nullptr
são idênticos em Objective-C ++ com C ++ 11.Estilisticamente, muitas pessoas preferem usar
nil
para objetos Objective-C e /NULL
ounullptr
para outros tipos de ponteiros. Eu mesmo agora uso emnil
todos os lugares.[NSNull null]
é um objeto singleton usado para representar valores nulos em situações em quenil
é proibido como um valor (geralmente em um objeto de coleção como umNSArray
ouNSDictionary
). Tópicos de programação de número e valor: Usando o NSNullfonte
Para expandir um comentário de @cobbal:
MacTypes.h contém:
fonte
Como já mencionado, eles são os mesmos, mas eu uso um ou outro, dependendo do idioma em que a estrutura correspondente foi escrita.
Para tudo relacionado ao Objective-C, eu uso zero. Por exemplo:
No entanto, ao verificar a validade dos modelos de dados de uma estrutura C (como a estrutura AddressBook e CoreFoundation), uso NULL. Por exemplo:
Dessa forma, tenho dicas sutis no meu código se estiver lidando com código baseado em Obj-C ou C.
fonte
nil é um ponteiro de objeto para nada. Embora semanticamente distintos de NULL , eles são tecnicamente equivalentes um ao outro.
No nível da estrutura, o Foundation define NSNull , que define um método de classe, + null, que retorna o objeto NSNull singleton. NSNull é diferente de nulo ou NULL , pois é um objeto real , em vez de um valor zero.
Além disso, no Foundation / NSObjCRuntime.h, Nil é definido como um ponteiro de classe para nada.
Consulte isto para mais informações - nil / Nil / NULL / NSNull
fonte
Há uma diferença em alguns contextos.
Literalmente, Nulo é um caractere: ASCII 0.
Zero é equivalente a branco, sem valor.
Dependendo do contexto de programação, isso pode ser uma grande diferença.
fonte
Use NULL, por exemplo, quando você chama um método Objective-C com um parâmetro de saída do tipo (NSError **).
Eu vejo muitos exemplos de código na web em que as pessoas fornecem zero em vez de NULL nesse caso. Isso ocorre porque é um ponteiro para um ponteiro e, portanto, não é diretamente um tipo de objeto Objective-C. Como dito acima, nada deve ser usado para os tipos de objeto Objective-C.
fonte
Basicamente: nil: ponteiro nulo em um objeto e null: é para outro ponteiro de tipo
fonte
nulo significa ausência de valor, enquanto NULL representa No Object,
NSArray * array = @ [@ "Olá, mundo!", @ 101, [NSNULL null]];
Aqui [NSNULL null] é um objeto que não significa objeto; ao mesmo tempo, você não pode adicionar nada para indicar ausência de objeto.
você pode usar nulo e [NSNUll null] para verificar também.
fonte
Isso ajudará você a entender a diferença entre zero, NIL e nulo.
O link abaixo pode ajudá-lo de alguma forma:
http://nshipster.com/nil/
fonte