objective-c null nsnull

objective c - ¿Cómo detectar si NSString es nulo?



objective-c null (5)

Tengo un fragmento de código que detecta si un NSString es NULL , nil , etc. Sin embargo, se bloquea. Aquí está mi código:

NSArray *resultstwo = [database executeQuery:@"SELECT * FROM processes WHERE ready=''yes'' LIMIT 0,1"]; for (NSDictionary *rowtwo in resultstwo) { NSString *getCaption = [rowtwo valueForKey:@"caption"]; if (getCaption == NULL) { theCaption = @"Photo uploaded..."; } else if (getCaption == nil) { theCaption = @"Photo uploaded..."; } else if ([getCaption isEqualToString:@""]) { theCaption = @"Photo uploaded..."; } else if ([getCaption isEqualToString:@" "]) { theCaption = @"Photo uploaded..."; } }

Y aquí está el error:

NSInvalidArgumentException de NSInvalidArgumentException debido a la excepción no NSInvalidArgumentException '' NSInvalidArgumentException '', razón: '' -[NSNull isEqualToString:] : selector no reconocido enviado a la instancia 0x3eba63d4 ''

¿Estoy haciendo algo mal? ¿Debo hacerlo de otra manera?


Deberías usar

if ([myNSString isEqual:[NSNull null]])

Esto verificará si el objeto myNSString es igual al objeto NSNull.


if([getCaption class] == [NSNull class]) ...

También puedes hacer

if([getCaption isKindOfClass:[NSNull class]]) ...

si quieres ser a prueba del futuro contra nuevas subclases de NSNull.


El valor NULL para objetos Objective-C (tipo id ) es nil .

Mientras que NULL se usa para punteros C (escriba void * ).

(Al final ambos terminan manteniendo el mismo valor ( 0x0 ). Sin embargo, difieren en el tipo).

En Objective-C :

  • nil (en minúsculas) es un puntero nulo para un objeto Objective-C .
  • Nil (en mayúscula) es un puntero nulo a una clase Objective-C .
  • NULL (mayúsculas) es un puntero nulo para cualquier otra cosa ( punteros C , eso es) .
  • [NSNull null] es un singleton para situaciones donde el uso de nil no es posible (agregar / recibir nil a / de NSArray s por ejemplo)

En Objective-C ++ :

  • Todo lo anterior , más:
  • null (minúsculas) o nullptr ( C ++ 11 o posterior) es un puntero nulo para objetos C ++ .

Entonces, para verificar contra nil , debe comparar contra nil (o NULL respectivamente) explícitamente :

if (getCaption == nil) ...

o deje que ObjC / C lo haga implícitamente para usted:

if (!getCaption) ...

Esto funciona como toda expresión en C (y con Objective-C siendo un superconjunto de la misma) tiene un valor booleano implícito:

expression != 0x0 => true expression == 0x0 => false

Ahora bien, al comprobar NSNull esto obviamente no funcionaría, ya que [NSNull null] devuelve un puntero a una instancia singleton de NSNull , y no es nil , y por lo tanto no es igual a 0x0 .

Entonces, para verificar contra NSNull uno puede usar:

if ((NSNull *)getCaption == [NSNull null]) ...

o (preferido, ver comentarios):

if ([getCaption isKindOfClass:[NSNull class]]) ...

Tenga en cuenta que este último (utilizando una llamada de mensaje) devolverá false si getCaption es nil , lo que, aunque formalmente correcto, puede no ser lo que espera / desea.

Por lo tanto, si uno (por la razón que sea) necesitara NSNull tanto con nil / NULL como con NSNull , habría que combinar esas dos comprobaciones:

if (!getCaption || [getCaption isKindOfClass:[NSNull class]]) ...

Para obtener ayuda sobre cómo formar verificaciones positivas equivalentes, consulte las leyes de De Morgan y la negación booleana .

Editar: NSHipster.com acaba de publicar un excelente artículo sobre las diferencias sutiles entre nulo, nulo, etc.


La forma preferida de comprobar si NSNULL es

if(!getCaption || [getCaption isKindOfClass:[NSNull class]])


Simplemente verifique con este código:

NSString *object; if(object == nil)

Esto debería funcionar.