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
deNSInvalidArgumentException
debido a la excepción noNSInvalidArgumentException
''NSInvalidArgumentException
'', razón: ''-[NSNull isEqualToString:]
: selector no reconocido enviado a la instancia0x3eba63d4
''
¿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 / deNSArray
s por ejemplo)
En Objective-C ++ :
- Todo lo anterior , más:
-
null
(minúsculas) onullptr
( 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.