J'ai un objet conforme au protocole NSCoding.Puis-je faire ça ?? Essayer de charger un objet à partir de lui-même
L'objet contient une méthode pour se sauver à la mémoire, comme ceci:
- (void)saveToFile {
NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:self forKey:kDataKey];
[archiver finishEncoding];
[data writeToFile:[self dataFilePath] atomically:YES];
[archiver release];
[data release];
}
Cela fonctionne très bien. Mais je voudrais aussi initialiser une version vide de cet objet et ensuite appeler sa propre méthode 'Load' pour charger toutes les données présentes dans le fichier dans ses variables. J'ai donc créé ce qui suit:
- (void)loadFromFile {
NSString *filePath = [self dataFilePath];
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
NSData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
self = [unarchiver decodeObjectForKey:kDataKey];
[unarchiver finishDecoding];
}
}
Maintenant, cette deuxième méthode ne parvient pas à charger des variables. Cette ligne n'est-elle pas possible peut-être?
self = [unarchiver decodeObjectForKey:kDataKey];
En fin de compte, je voudrais utiliser le code comme ceci:
Un viewController prend l'utilisateur est entré dans l'entrée, crée un objet et il enregistre dans la mémoire en utilisant
[anObject saveToFile];
Et un second viewController crée un objet vide, puis initialise ses valeurs à celles stockées dans le fichier en appelant:
[emptyObject loadFromFile];
Toutes les suggestions sur la façon de faire ce travail seraient grandement appréciées. Merci :)
Michael
Merci pour la réponse rapide! La méthode decodeObjectForKey: n'utilise-t-elle pas automatiquement ma méthode initWithCoder: lorsqu'elle essaie de décoder les données sauvegardées? Donc je n'ai pas besoin de l'appeler explicitement? D'où la ligne: self = [unarchiver decodeObjectForKey: kDataKey]; Ou est-ce que je m'embrouille? – Smikey
C'est le cas, mais je pense que la façon dont vous devez utiliser le protocole est via son message 'initWithCoder:'. – pgb
Ok - mais la méthode initWithCoder: doit être passée à un objet NSCoder - que dois-je utiliser pour cela? – Smikey