Pregunta

Tengo una matriz que estoy ahorrando para NSUserDefaults, que contiene una matriz de mi asignación de clase personalizada, que cumpla con el protocolo NSCoding. La matriz guarda y carga adecuadamente, y puedo comprobar que el primer objeto recuperado de la matriz es de la asignación de clase. El problema ocurre cuando intento acceder a Ivars del objeto Asignación de la matriz. Se estrella y me da el siguiente error:

*** -[CFString respondsToSelector:]: message sent to deallocated instance 0x3948d60

Aquí está el código que estoy usando para salvar a los valores predeterminados de usuario. Tenga en cuenta que también estoy recuperar y verificar el objeto guardado para fines de depuración.

 -(void)saveToUserDefaults:(NSArray*)myArray
{
    NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];

    if (standardUserDefaults) {
        [standardUserDefaults setObject:[NSKeyedArchiver archivedDataWithRootObject:myArray] forKey:@"Assignments"];
        [standardUserDefaults synchronize];
    }
    NSLog(@"Assignments array saved. (%d assignments in array)",[myArray count]);
    NSData *dataCheck = [[NSData alloc] initWithData:[standardUserDefaults objectForKey:@"Assignments"]];
    NSArray *arrayCheck = [[NSArray alloc] initWithArray:[NSKeyedUnarchiver unarchiveObjectWithData:dataCheck]];
    NSLog(@"Checking saved array (%d assignments in array)",[arrayCheck count]);
    if ([[arrayCheck objectAtIndex:0] isKindOfClass:[Assignment class]]) {
        NSLog(@"It's of the class Assignment.");
    }
    Assignment *testAssignment = [[Assignment alloc] initWithAssignment:[arrayCheck objectAtIndex:0]];
    NSLog(@"Title: %@ Course: %@",[testAssignment title],[testAssignment course]);
}

Todo está bien hasta que asigno testAssignment, que es donde ocurre el accidente. ¿Alguien tiene alguna idea?

EDIT: Aquí están mis métodos NSCoding en la clase Asignación:

- (void)encodeWithCoder:(NSCoder *)coder {
    [coder encodeObject:title forKey:@"title"];
    [coder encodeObject:course forKey:@"course"];
    [coder encodeObject:dueDate forKey:@"dueDate"];
    [coder encodeObject:notes forKey:@"notes"];
}

- (id)initWithCoder:(NSCoder *)coder {
    self = [[Assignment alloc] init];
    if (self != nil)
    {
        title = [coder decodeObjectForKey:@"title"];
        course = [coder decodeObjectForKey:@"course"];
        dueDate = [coder decodeObjectForKey:@"dueDate"];
        notes = [coder decodeObjectForKey:@"notes"];
    }   
    return self;
}
¿Fue útil?

Solución

contestado a mi propia pregunta. En initWithCoder, que necesitaba para retener todos los objetos que estaba decodificación:

//Example    
title = [[coder decodeObjectForKey:@"title"] retain];

Todo funciona muy bien ahora. :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top