setObject: ForKey: crash?

Recibo este bloqueo en la consola:

2011-08-27 23:26:45.041 App[1672:3117] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary setObject:forKey:]: attempt to insert nil key'
*** First throw call stack:
(0x3231c8c3 0x362ee1e5 0x3231c7bd 0x3231c7df 0x32289679 0x3052e865 0x3220fd55 0x3221b7a3 0x3345e4b7 0x3345e38c)
terminate called throwing an exception[Switching to process 10243 thread 0x2803]
[Switching to process 10243 thread 0x2803]

La única línea que creo que se dispararía en el momento en que se bloquea y que se relaciona con este bloqueo es esta línea:

UIImage *photo = [self.selectedDictionary objectForKey:@"ProfileImage"];

¿Algo se ve mal aquí? ¿Cual podría ser el problema?

Edit1: se bloquea cuando hago esto para llamar a un método: Código:

if(actionSheet.tag == 1) {
            [self showAchievements];
        }

Este es el método showAchievements: Código:

- (void)showAchievements {
    GKAchievementViewController *achievements = [[GKAchievementViewController alloc] init];
    if (achievements != nil)
    {
        achievements.achievementDelegate = self;
        [self presentModalViewController:achievements animated:YES];
    }
}

- (void)achievementViewControllerDidFinish:(GKAchievementViewController *)viewController
{
    [self dismissModalViewControllerAnimated:YES];
    [viewController release];
}

¿Puede este bloqueo deberse a que no he conectado todo correctamente en iTC? Definitivamente estoy seguro de que falla con ese método y no sé por qué.

¿Alguien tiene alguna idea?

Edit2: Me estoy acercando aquí, en mi consola, justo antes de que se bloquee, tiene una línea que dice Método perdido. Así que busco dónde está este NSLog y está en GameCenterManager.m, un archivo necesario para Game Center, creo. Este es el método:

    - (void) callDelegate: (SEL) selector withArg: (id) arg error: (NSError*) err
{
    assert([NSThread isMainThread]);
    if([delegate respondsToSelector: selector])
    {
        if(arg != NULL)
        {
            [delegate performSelector: selector withObject: arg withObject: err];
        }
        else
        {
            [delegate performSelector: selector withObject: err];
        }
    }
    else
    {
        NSLog(@"Missed Method");
    }
}

Entonces, a partir de ese código, ¿ves qué está mal?

¡Gracias!

preguntado el 28 de agosto de 11 a las 03:08

2 Respuestas

Supongo que la respuesta está ahí en el código que publicaste:

reason: '-[__NSCFDictionary setObject:forKey:]: attempt to insert nil key'

No puede insertar una clave nula en un diccionario. ¿Estás haciendo algo como [myDictionary setObject: foo forKey: bar] donde 'bar' es nil?

Por cierto, tampoco puede insertar valores nulos en un diccionario, pero eso no parece ser lo que indica el motivo del error. usted enlatado llámenos al [myDictionary setValue:nil forKey:bar] (siempre que la barra no sea nula): esto elimina la clave del diccionario. Y si desea indicar un valor "nulo", puede insertar el NSNull objeto en un diccionario. Pero las llaves, las llaves deben Siempre hay ser no nulo.

Respondido el 18 de enero de 13 a las 12:01

¿Cómo haría correctamente NSLog para comprobar si una clave es nula? Además, ¿por qué una clave sería nula ya que no es un objeto y cómo la arreglaría? - SimplyKiwi

Busque cualquier lugar donde esté colocando objetos en un diccionario y registre los valores que está insertando. ¿Siempre usa literales (por ejemplo, @ "thisIsALiteral") para las claves, o algunas veces usa variables? ¿Está haciendo una manipulación compleja de lista a lista? Me resulta difícil describir cada caso. Solo publique un par de inserciones y partiremos de allí. - AndrewS

Si ve el mensaje "Método perdido", entonces el código terminó esa función y probablemente esté en la siguiente. Veo que GameCenterManager es una biblioteca de terceros y administra un diccionario de logros. Es posible que tenga un logro en algún lugar con un identificador nulo. - AndrewS

Realmente estoy perdido. Cuando muestro el controlador de vista de la tabla de clasificación para Game Center, todo está bien, pero cuando muestro el controlador de vista de logros para Game Center, se bloquea. ¿Algunas ideas? ¿Debo publicar mi índice clickedbuttonatindex, que es como invoco estos controladores de vista (hoja de acción)? - SimplyKiwi

Creo que son los datos que entran en estas vistas. ¿Simplemente empieza a lanzar puntos de interrupción por todas partes hasta que lo encuentres? No tengo idea, no estoy tan familiarizado con Game Center. - AndrewS

Desde el registro parece la clave profileImage iguales nil lo que significa que no hay datos para esa clave en su NSDictionary.

Respondido 28 ago 11, 07:08

Acabo de verificar si la clave es nula y no lo es, entonces, ¿qué más podría ser el problema? - SimplyKiwi

¿Estás REALMENTE seguro de que no es nulo? ¡Cualquier error de ortografía menor lo estropeará! Intente NSLog su objectForKey: y vea lo que salió, ¿puede incluso guardar imágenes en un diccionario? Creo que no puede, ese podría ser el problema, tal vez esté tratando de darle a un UIImage un valor incorrecto o incluso nulo, verifique eso. - JonasG

También intente NSLog todo su diccionario, luego podrá analizarlo correctamente. - JonasG

¿Hay alguna manera de comprobar en qué línea exacta se bloquea una aplicación, parece que se está bloqueando en otro lugar ahora y necesito saber exactamente dónde? - SimplyKiwi

¿No estás usando xcode 4? Le muestra la línea exacta de código donde se bloqueó. - JonasG

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.