Frage

Ich habe ein Array, das ich NSUserDefaults bin zu speichern, ein Array von meiner benutzerdefinierten Klasse Zuordnung enthalten, die das NSCoding Protokoll entspricht. Das Array speichert und lädt richtig, und ich kann bestätigen, dass die abgerufene erste Aufgabe der Array der Zuteilung ist. Das Problem tritt auf, wenn ich versuche ivars des Zuweisungs Objekts im Array zuzugreifen. Es stürzt ab und ich bekomme die folgende Fehlermeldung:

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

Hier ist der Code ich verwende, um Benutzereinstellungen zu speichern. Beachten Sie, dass ich bin auch das Abrufen und die Überprüfung des gespeicherten Objekts zum Debuggen.

 -(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]);
}

Alles ist gut, bis ich zuteilen testAssignment, das ist, wo der Absturz passiert. Hat jemand irgendwelche Ideen?

EDIT: Hier ist meine NSCoding Methoden in der Zuordnung Klasse sind:

- (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;
}
War es hilfreich?

Lösung

meine eigene Frage beantwortet. In initWithCoder, musste ich alle Objekte behalten ich Decodierung:

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

Alles funktioniert wunderbar jetzt. :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top