Yo estaba usando esto en mi iPhone app

if (title == nil) {
    //do something
}

pero lanza alguna excepción, y la consola muestra que el título es «(null)».

Así que estoy usando esta ahora:

if (title == nil || [title isKindOfClass:[NSNull class]]) {
    //do something
}

¿Cuál es la diferencia y cuál es la mejor manera de determinar si una cadena es nula?

20 Comentarios

  1. 390

    Como otros han señalado, hay muchos tipos de «null» en virtud de Cacao/Objetivo C. Pero una cosa más a tener en cuenta es que [título isKindOfClass:[NSNull clase]] es innecesariamente complejo, ya que [NSNull null] se documenta a ser un singleton con lo que se puede comprobar puntero de la igualdad. Ver Temas para el Cacao: el Uso de Null.

    Así que una buena prueba podría ser:

    if (title == (id)[NSNull null] || title.length == 0 ) title = @"Something";

    Nota cómo se puede utilizar el hecho de que incluso si el título es nulo, de título.longitud 0/nil/falso, es decir, 0 en este caso, por lo que no tiene caso especial es. Esto es algo que las personas que son nuevos en Objective C acostumbrarte, especialmente provenientes de otros idiomas, donde los mensajes/llamadas de método a cero accidente.

    • Gracias! Sin embargo, me hizo esta pregunta, en primer lugar, porque me estaba poniendo de excepción debido a que el «título» null.
    • De qué tipo es el título supone? Si es un NSString, por ejemplo, aparece la siguiente advertencia: comparación de los distintos Objective-C ‘tipos struct NSNull *’ y ‘struct NSString *’ carece de un yeso Es, hay alguna manera de quitar esto (no sé si las cosas han cambiado desde que esta pregunta se la hicieron)?
    • Me sirve la derecha para enviar el código sin compilar ;-). el título es, presumiblemente, una NSString, pero, independientemente del título del tipo, sólo elenco null para el id genérico tipo: (id)[NSNull null].
    • Hola, he probado un caso mediante el establecimiento de una cadena de nada y a ver si pasa esta instrucción: if(cadena == (id)[NSNull null]). Pero nunca se me pasó. Se puede citar un ejemplo donde la cadena será igual a [NSNull null]. ?
    • nil y [NSNull null] nunca será el mismo. [NSNull null] es un objeto singleton que puede ser utilizado como un soporte para nil cuando nil no pueden ser utilizados (por ejemplo, en un NSArray o NSDictionary valor). Así que un caso de uso puede ser donde había un NSArray de opcional cadenas, algunas de las cuales podrían ser nulos, y utilice [NSNull null] en la matriz para el nula de los casos. En la práctica, la prueba rara vez es necesaria, sólo cuando usted (o una biblioteca de usar!) usar activamente [NSNull null] como un marcador de posición.
    • entendido. Muchas gracias!
    • La principal diferencia es que nil es, así, un puntero a nada (efectivamente ser un «puntero nulo»), que representa la dirección de memoria 0x0 y se trata de NULL en C. [NSNull null], en el otro lado, es un objeto que se considera un valor null-representación por convención (es diferente a 0x0 dirección de memoria, pero como un singleton, que tendrá sólo un fijo de direcciones de memoria en tiempo de ejecución). Como colecciones como NSArray * y NSDictionary *, entre otros, no puede tomar punteros null, se aceptan [NSNull null] sin problemas, ya que es un objeto de instancia.

  2. 25

    es tan simple como

    if([object length] >0)
    {
      //do something
    }

    recordar que en objective C si el objeto es null, se devuelve 0 como el valor.

    De esta manera se consigue una cadena nula y una cadena de longitud 0.

    • Excelente, este no funciona para mí.
    • Esto no funcionará si el objeto es NSNull, siendo necesario comprobar explícitamente que la primera.
    • también puedes hacer una categoría para NSNull para hacerla volver de 0 a la longitud del mensaje 🙂
    • Sí, esto va a bloquearse si el objeto es NSNull.
    • Este se bloqueará si el objeto es igual a NSNull
    • Además de la NSNull no reconocido selector de tema, el no diferenciar entre un NSString puntero nulo, o un NSString que realmente existe, pero es esencialmente una cadena vacía. (Por ejemplo, como un literal object = @""; o object = nil;)
    • ¿Y si la cadena es vacía, pero no nula?

  3. 6

    Referirse a los siguientes artículos relacionados en este sitio:

    Creo que tu error está relacionado con algo que no es necesario para hacer el extra de cheques.

    Ver también esta relacionada con la pregunta: Comprobación apropiada de la desaparición de los sqlite columna de texto

    • Molesto no tengo suficiente «puntos» para añadir un segundo hipervínculo (incluso a algo en este sitio) ver también: – stackoverflow.com/questions/598396/…
    • …me lo permita. Aunque usted debe ser capaz de editar tus propios mensajes desde rep 0.
    • Gracias – que fue muy amable. Cuando escribí mi primer post dijo algo así como los nuevos usuarios sólo se puede añadir 1 hipervínculo (que parece un poco duro, especialmente para los enlaces cruzados en este sitio).
  4. 5

    Lo que es con todos estos «funciona para mí respuestas» ? Estamos todos de codificación en el mismo idioma y las reglas son

    1. Asegurarse de que la referencia no es nil
    2. Compruebe y asegúrese de que la longitud de la cadena no es 0

    Que es lo que va a trabajar para todos. Si una solución dada sólo «trabaja para usted», sólo porque su flujo de aplicación no permite un escenario donde la referencia puede ser null o la longitud de la cadena a ser 0. La manera correcta de hacer esto es el método que se va a controlar lo que se desea en todos los casos.

    • Si la referencia es nil (nota: no es «null»), a continuación, enviar un mensaje, como length, producirá 0 (o el correspondiente valor de 0 para el método del tipo de retorno). Que la regla de la lengua. No hay necesidad de comprobar nil por separado en este caso.
    • Me dijo: null, simplemente porque de C++ hábitos, y si el código es llamar a métodos en la nada de los objetos, es probable que su código está roto. Usted encontrará que llamar a métodos en NULL/NIL (mismo concepto) es generalmente una mala idea en cualquier idioma. Sólo porque obj-c le permite hacer algo como eso no significa que usted debe pasar alrededor de nil objetos y trata de usar sin cuidado.
    • El envío de longitud nulo no produce 0 – PERO el envío de longitud NSNull produce una excepción.
    • Nadie dice nada acerca de que acaban de pasar alrededor de nil objetos, pero la comprobación de nil, a continuación, llamar a un método y el uso de su valor de retorno es la OMI peor que el uso de una característica del lenguaje como es destinado a ser utilizado y la comprobación de la validez del método del valor de retorno después.
    • No estoy seguro de lo peor de la realidad, simplemente porque es una característica del lenguaje no significa que su gran. De no comprobar si su nulo podría abrir una ruta de código que podría conducir a una más difícil rastrear error de tiempo de ejecución. Su mejor verificar que sus entradas son como se esperaba, y reaccionar en consecuencia si no lo son. No me gusta la «característica» de no llegar excepciones en tiempo de ejecución cuando se intenta enviar un mensaje a un objeto nil, ya que a menudo hace que sea más fácil pasar por alto algunos errores de tiempo de ejecución de.
  5. 5

    He encontrado que en el fin de realmente hacerlo bien usted termina encima de tener que hacer algo similar a

    if ( ( ![myString isEqual:[NSNull null]] ) && ( [myString length] != 0 ) ) {
    }

    De lo contrario se obtiene extrañas situaciones en las que el control seguirán eludir su cheque. No he encontrado uno que lo hace pasado la isEqual y verificaciones de longitud.

  6. 4

    Si quieres prueba en contra de todos nil/objetos vacíos (como cadenas vacías o matrices vacías/juegos) puede utilizar el siguiente:

    static inline BOOL IsEmpty(id object) {
        return object == nil
            || ([object respondsToSelector:@selector(length)]
            && [(NSData *) object length] == 0)
            || ([object respondsToSelector:@selector(count)]
            && [(NSArray *) object count] == 0);
    }
    • En realidad, no se echa de objeto == [NSNull null], que probablemente tendría sentido.
  7. 3

    Hay dos situaciones:

    Es posible que un objeto es [NSNull null], o es imposible.

    Su aplicación, normalmente no se debe usar [NSNull null]; solo lo use si usted quiere poner un «null» objeto en una matriz, o utilizarlo como un valor de diccionario. Y, a continuación, usted debe saber que las matrices o los diccionarios puede contener valores nulos, y que no podría.

    Si usted piensa que una matriz nunca contiene [NSNull null] valores, entonces no hay que comprobarlo. Si hay un [NSNull null], puede recibir una excepción, pero que está bien: Objective-C las excepciones indican los errores de programación. Y usted tiene un error de programación que se debe arreglar cambiando el código.

    Si un objeto podría ser [NSNull null], a continuación, comprobar si esto simplemente mediante la prueba

    (object == [NSNull null]). Llamar isEqual o la comprobación de la clase de objeto es una tontería. Sólo hay una [NSNull null] objeto, y la llanura de edad C operador comprueba bien en el más sencillo y más eficiente.

    Si usted echa un NSString objeto que no se puede [NSNull null] (porque sabes que no puede ser [NSNull null] o porque simplemente comprueba que es diferente de [NSNull null], entonces usted necesita preguntarse a sí mismo cómo quieres tratar una cadena vacía, que es uno con una longitud de 0. Si el tratamiento es un null cadena como nil, luego de la prueba de (object.length == 0). objeto.longitud devolverá 0 si object == nil, por lo que esta prueba cubre nil objetos y cadenas de caracteres con una longitud de 0. Si tratas a una cadena de longitud 0 diferente de cero de la cadena, compruebe si object == nil.

    Por último, si desea añadir una cadena a un array o un diccionario, y la cadena podría ser nulo, usted tiene la opción de no añadir, reemplazando con @"", o reemplazarlo con [NSNull null]. Reemplazarlo con @"" significa que usted pierde la capacidad de distinguir entre «sin cadena» y «cadena de longitud 0». Reemplazarlo con [NSNull null] significa que usted tendrá que escribir código cuando se tiene acceso a la matriz o un diccionario que busca [NSNull null] objetos.

    • Muy largo, pero esto es bueno. NSNull SÓLO debe APARECER EN los embarazos ÚNICOS! Toda esta pregunta no tiene sentido, me dice que el programador no estaba haciendo algo correcto, y muchos más en el futuro también, no lea el manual de buenas práctica de código
  8. 2

    Usted acaba de comprobar nil

    if(data[@"Bonds"]==nil){
      NSLog(@"it is nil");
    }

    o

    if ([data[@"Bonds"] isKindOfClass:[NSNull class]]) {
        NSLog(@"it is null");
    }
  9. 2

    Aquí es la macro que yo uso para la seguridad de la cadena en lugar de llegar «(null)» de la cadena en un UILabel por ejemplo:

    #define SafeString(STRING) ([STRING length] == 0 ? @"" : STRING)

    digamos que usted tiene un miembro de la clase y el nombre de la propiedad, y el nombre es nula:

    NSLog(@"%@", member.name); //prints (null) on UILabel

    con macro:

    NSLog(@"%@", SafeString(member.name)); //prints empty string on UILabel

    agradable y limpio.

  10. 1
    @interface NSString (StringFunctions)
    - (BOOL) hasCharacters;
    @end
    
    @implementation NSString (StringFunctions)
    - (BOOL) hasCharacters {
        if(self == (id)[NSNull null]) {
            return NO;
        }else {
            if([self length] == 0) {
                return NO;
            }
        }
        return YES;
    }
    @end
    
    NSString *strOne = nil;
    if([strOne hasCharacters]) {
        NSLog(@"%@",strOne);
    }else {
        NSLog(@"String is Empty");
    }

    Esto funciona con los siguientes casos, NSString *strOne = @"" O NSString *strOne = @"StackOverflow" O NSString *strOne = [NSNull null] O NSString *strOne.

  11. 0

    Si ese tipo de cosas ya no existe, usted puede hacer un NSString categoría:

    @interface NSString (TrucBiduleChoseAdditions)
    
    - (BOOL)isEmpty;
    
    @end
    
    @implementation NSString (TrucBiduleChoseAdditions)
    
    - (BOOL)isEmpty {
        return self == nil || [@"" isEqualToString:self];
    }
    
    @end
    • Eso es probablemente exagerado y creo que no va a resolver este problema.
    • El auto == nil es inútil – si el auto fue nula, Objective C no te he llamado en primer lugar. [(NSString*)nil isEmpty] simplemente return 0/nil/falso sin llamar a su código.
    • En realidad, además, [(NSString*)nil isEmpty] devolverá false. Cuando la escritura, tales C Objetivo de los métodos, es mejor definir ellos para que nil 0/nil/false tiene sentido, así que la escritura el método de la hasCharacters sería mejor. Tenga en cuenta que la longitud de la que ya funciona para esto, puede usar si.de longitud ) en cualquier lugar que desee utilizar if ( !s.isEmpty ) y s.longitud correctamente devolverá 0 para s == nil caso.
    • Esto es un grave accidente. La implementación de «isEmpty» para NSString, pero si es que en realidad NSNull, entonces isEmpty será enviado a NSNull, y crash porque no responde a ese mensaje!
  12. 0

    Lo que funciona para mí es if ( !myobject )

    • Eso no funciona para objetos nulos, sólo nil objetos. Por ejemplo… NSArray *testarray = [NSArray arrayWithObjects:[NSNull null],@"", nil]; NSString *string = [testarray objectAtIndex:0]; NSLog(@"null string value: %@",string); if (!string) { NSLog(@"string evaluates to null"); } if (string && (string==(id)[NSNull null])) { NSLog(@"string does not evaluate to null"); }
    • Err.. lo siento por el formato, pero el código se compilará 🙂
  13. 0

    Termine la comprobación de una cadena de condiciones de nula puede ser el siguiente :<\br />

     si(micadena) 
    { 
    si([mystring isEqualToString:@""]) 
    { 
    [email protected]"cadena"; 
    } 
    } 
    otra cosa 
    { 
    //declaraciones 
    }
  14. 0

    Para la cadena:

    + (BOOL) checkStringIsNotEmpty:(NSString*)string {
    if (string == nil || string.length == 0) return NO;
    return YES;

    }

    Consulte la imagen siguiente:

    ¿Cuál es la mejor forma de comprobar si una cadena nula en Objective-C?

  15. 0

    Para la cadena:

    + (BOOL) checkStringIsNotEmpty:(NSString*)string {
    if (string == nil || string.length == 0) return NO;
    return YES;}
  16. -1
    if ([linkedStr isEqual:(id)[NSNull null]])
                    {
                        _linkedinLbl.text[email protected]"No";
                    }else{
                        _linkedinLbl.text[email protected]"Yes";
                    }
    • Mientras este fragmento de código se puede responder a la pregunta, no se provee de un contexto para explicar cómo o por qué. Considerar la adición de una frase o dos para explicar su respuesta.
  17. -1
    if ([strpass isEqual:[NSNull null]] || strpass==nil || [strpass isEqualToString:@"<null>"] || [strpass isEqualToString:@"(null)"] || strpass.length==0 || [strpass isEqualToString:@""])
    {
        //string is blank  
    }

Dejar respuesta

Please enter your comment!
Please enter your name here