Question

J'ai un tableau que je suis à sauver NSUserDefaults, contenant un tableau de ma classe personnalisée Attribution, qui est conforme au protocole NSCoding. Le tableau enregistre et charges correctement, et je peux vérifier que le premier objet récupéré du tableau est de la cession de la classe. Le problème se produit lorsque je tente d'accéder Ivars de l'objet d'affectation dans le tableau. Il se bloque et je reçois l'erreur suivante:

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

Voici le code que je utilise pour enregistrer les paramètres par défaut de l'utilisateur. Notez que je suis aussi et vérifier la récupération l'objet enregistré à des fins de débogage.

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

Tout va bien jusqu'à ce que je testAssignment allouer, qui est l'endroit où l'accident se produit. Est-ce que quelqu'un a des idées?

EDIT: Voici mes méthodes de NSCoding dans la classe d'affectation:

- (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;
}
Était-ce utile?

La solution

a répondu à ma propre question. En initWithCoder, je avais besoin de conserver tous les objets que je Décodage:

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

Tout fonctionne à merveille maintenant. :)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top