Comment coder et décoder une classe personnalisée avec NSKeyedArchiver

J'ai une classe personnalisée qui je souhaite enregistrer et charger. La classe contient un NSDate, un NSString, et un NSNumber. J'ai mis en œuvre la NSCoding protocole dans le .h fichier. Voici le code que j'ai jusqu'ici. la date est un NSDate. son nom est le NSString. homeAway est le NSNumber.

-(void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:theDate forKey:@"theDate"];
[aCoder encodeObject:theName forKey:@"theName"];
[aCoder encodeObject:homeAway forKey:@"homeAway"];
}

-(id)initWithCoder:(NSCoder *)aDecoder {
if ((self = [super init])) {
    theDate = [aDecoder decodeObjectForKey:@"theDate"];
    theName = [aDecoder decodeObjectForKey:@"theName"];
    homeAway = [aDecoder decodeObjectForKey:@"homeAway"];
}
return self;
}

Je suis en utilisant le code ci-dessous pour charger mon objet personnalisé. Lorsque j'utilise l'impression de l'objet dans le Débogueur seulement la homeAway s'affiche comme un objet réel. la date et le nom dire 0x4e4f150 ne semble pas pointer vers un objet valide.

[gamesArray setArray:[NSKeyedUnarchiver unarchiveObjectWithFile:path]];  
Game *loadedGame = [gamesArray objectAtIndex:gameNumber];

Je enregistrer les données en utilisant le code suivant:

Je l'utilise pour appeler ma classe pour créer un nouveau Jeu (de la classe personnalisée, que je suis en train d'enregistrer). Le code à NSDate *aDate = [gameDate date]; n'est pas pertinent.

-(void)newGame {
if (homeAway != 0) {
    if (dateChanged == 1) {
        if ([nameField.text length] > 0) {
            [homeButton setImage:[UIImage imageNamed:@"HomeGray.png"] forState:UIControlStateNormal];
            [awayButton setImage:[UIImage imageNamed:@"AwayGray.png"] forState:UIControlStateNormal];
            [dateButton setImage:[UIImage imageNamed:@"DateGray.png"] forState:UIControlStateNormal];
            [nameField setBackground:[UIImage imageNamed:@"textField.png"]];
            NSDate *aDate = [gameDate date];
            NSString *aString = [[[NSString alloc] initWithString:[nameField text]] autorelease];
            UIApplication *app = [UIApplication sharedApplication];
            [[[(miShotTrackAppDelegate *)[app delegate] viewController] courtViewOne] newGame:aDate withName:aString andPlace:homeAway];
            [loadTable reloadData];
            datePicke = 0;
            homeAway = 0;
            dateChanged = 0;
            nameField.text = @"";
            [self goBack];
            [self autoSave];
        }
    }
}

}

À partir de cette méthode, j'appelle le newGame méthode qui est

-(void)newGame:(NSDate *)theDate withName:(NSString *)theName andPlace:(int)homeAway {

Game *newGame = [[Game alloc] init];
NSDate *tDate = [NSDate new];
tDate = theDate;
[newGame setTheDate:tDate];
NSString *tString = [NSString stringWithString:theName];
[newGame setTheName:tString];
NSNumber *theNumber = [NSNumber numberWithInt:homeAway];
[newGame setHomeAway:theNumber];
[gamesArray addObject:newGame];
gameNumber = [gamesArray count] - 1;
NSString *path = [self findGamesPath];
[NSKeyedArchiver archiveRootObject:gamesArray toFile:path];
[newGame release];
}

Pourquoi mes objets pas enregistrer? Ne la copie de mes objets ont quelque chose à faire avec elle? Je n'obtiens une erreur sur la ligne de commentaire qui dit "exc mauvais accès". S'il vous plaît aider...

OriginalL'auteur Blane Townsend | 2011-04-24