2010-04-18 12 views
7

Tengo un problema con NSDictionary que devuelve null para un NSString aunque la cadena está en el diccionario. Aquí está el código:¿Qué causaría que objectForKey: devuelva nulo con una cadena válida en su lugar?

- (void)sourceDidChange:(NSNotification *)aNote { 
    NSDictionary *aDict = [aNote userInfo]; 
    DLog(@"%@", aDict); 
    NSString *newSourceString = [aDict objectForKey:@"newSource"]; 
    DLog(@"%@", newSourceString); 
    newSourceString = [newSourceString stringByReplacingOccurrencesOfString:@" " withString:@""]; 
    DLog(@"%@", newSourceString); 
    NSString *inspectorString = [newSourceString stringByAppendingString:@"InspectorController"]; 
    DLog(@"%@", inspectorString); 
    newSourceString = [newSourceString stringByAppendingString:@"ViewController"]; 
    DLog(@"%@", newSourceString); 
} 

Y consigo las siguientes declaraciones de registro:

2010-04-17 23:50:13.913 CoreDataUISandbox[13417:a0f] -[RightViewController sourceDidChange:] { newSource = "Second View"; } 
2010-04-17 23:50:13.914 CoreDataUISandbox[13417:a0f] -[RightViewController sourceDidChange:] (null) 
2010-04-17 23:50:13.916 CoreDataUISandbox[13417:a0f] -[RightViewController sourceDidChange:] (null) 
2010-04-17 23:50:13.917 CoreDataUISandbox[13417:a0f] -[RightViewController sourceDidChange:] (null) 
2010-04-17 23:50:13.917 CoreDataUISandbox[13417:a0f] -[RightViewController sourceDidChange:] (null) 

Como se puede ver, la cadena está en el diccionario bajo la clave newSource, aún cuando llamo objectForKey:, me obtener null. Incluso he intentado la opción alternativa de limpiar el proyecto.

¿Alguien ha topado con esto alguna vez, o acabo de olvidar algo realmente básico?

+0

Por curiosidad, después de configurar y registrar 'aDict', ¿qué ocurre si haces' DLog (@ "% @", [aDict allKeys]); '? – Isaac

+0

¿Es este el código * actual *? ¿Alguna posibilidad de que hayas escrito mal la clave? ¿Qué ofrece 'DLog (@"% @ ", [aDict allKeys])'? –

+0

También es posible que desee intentar el registro 'newSourceString' con'% p' en lugar de '% @'. –

Respuesta

3

En este punto, por algún motivo, le queda un error de informe de DLog.

Probar:

  1. registro con NSLog.
  2. Compruebe el valor de newSourceString directamente en el depurador mientras el código está activo.
2

¿Qué causaría que objectForKey: devuelva nulo con una cadena válida en su lugar?

Una de dos cosas:

  1. El diccionario no contiene un objeto de esa tecla. (Si piensa que es irrelevante)
  2. No tiene diccionario; aDict es nil, por lo que está enviando el mensaje objectForKey: al nil. Los mensajes a nil no hacen más que devolver nil.

Como se puede ver la cadena está en el diccionario bajo la Newsource clave ...

En realidad, no estoy seguro de lo que está pasando allí. La descripción de un NSDictionary (si contenía una cadena para esa clave) sería { newSource = "some string here"; }, que no coincide con la descripción que ha registrado. Por otro lado, si se tratara de un objeto que no es un diccionario, debe obtener una excepción "no responde al selector" al intentar enviar un mensaje de objectForKey:. Entonces, aunque aparece, desde su salida de registro, para ser algo, no tengo idea de qué se trata, excepto que probablemente no es un diccionario.

Eso es simplemente extraño, entonces.

+0

Cada vez que pongo las llaves, arruinaron el bloque de código, así que tuve que eliminarlo (todavía no estoy seguro de por qué estaba sucediendo). – theMikeSwan

+0

He actualizado la pregunta para incluir las llaves en la declaración de registro basada en el comentario de @ theMikeSwan anterior. –

0

Sospecho que su cadena es, en realidad, literalmente "nula", es decir, tiene 6 letras de longitud y explica (-n-u-l-l-).

+0

La primera línea de la impresión muestra que la clave tiene un valor de "Segunda vista". – TechZen

+0

Si ese fuera el caso, entonces el paso que aplica 'stringByAppendingString:' no debería seguir produciendo '(null)'. – Isaac

+0

¿Nadie pensó que esto era realmente divertido? Voy a jugar esto como una broma a mi compañero algún día =) –

1

No omite el entorno en el que está codificando. Si es con GNUstep, específicamente, gnustep1.19, sigue leyendo.De lo contrario, ignóralo.

Acabo de encontrar un error muy extraño con gnustep1.19 (.3) pero imita perfectamente esta pregunta.

NSString * key = <some string> 
NSDictionary * dict = <some dictionary> 

(gdb) p [dict objectForKey:key] 
$20 = (struct objc_object *) 0x0 
(gdb) p [dict objectForKey:@"MyKeyValue"] 
$22 = (struct objc_object *) 0x7fffd94fe690 
(gdb) p [key compare"@MyKeyValue"] 
$25 = NSOrderedSame 

En este caso, 'clave' estaba siendo inicializa extrayéndolo de otra NSDictionary, y algunas de las entradas en el otro diccionario (cargado desde un archivo) contienen caracteres Unicode. Es decir, hasta ahora, la única correlación que he encontrado: eliminar el Unicode del archivo de origen y volver a ejecutar la aplicación hace que funcione.

Esto no es un problema para gnustep1.18 o> = gnustep1.20

2

me encontré con un problema similar. Para mí, el problema fue que pensé que mi clave era NSString cuando en realidad era NSNumber. Puede verificar su clave usando el siguiente

for (id key in [aDict allKeys]){ 
     NSLog(@"%@:%@",key, [[key class] description]); 
    } 
} 
+0

Este proceso me ayudó a resolver mi problema .. –

0

Sospecho que aDict no es una instancia de NSDictionary. registre su clase para confirmar.

Cuestiones relacionadas