Я могу это сделать?? Попытка загрузить объект изнутри себя - PullRequest
0 голосов
/ 13 мая 2010

У меня есть объект, который соответствует протоколу NSCoding.

Объект содержит метод для сохранения себя в памяти, например:

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

Это работает просто отлично. Но я также хотел бы инициализировать пустую версию этого объекта, а затем вызвать его собственный метод «Load», чтобы загрузить все имеющиеся в файле данные в его переменные. Итак, я создал следующее:

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

Теперь второму методу не удается загрузить переменные. Возможно, эта линия невозможна?

self = [unarchiver decodeObjectForKey:kDataKey];

В конечном итоге я хотел бы использовать код, подобный следующему:

Один viewController принимает введенный пользователем ввод, создает объект и сохраняет его в памяти, используя

[anObject saveToFile];

И второй viewController создает пустой объект, а затем инициализирует его значения, сохраненные в файле, вызывая:

[emptyObject loadFromFile];

Буду очень признателен за любые предложения о том, как сделать эту работу. Спасибо :)

Michael

1 Ответ

1 голос
/ 13 мая 2010

Почему бы вам не использовать initWithCoder: вместо этого? Он должен вернуть вам объект, инициализированный данным кодером. Поскольку ваш объект соответствует NSCoding, это не должно быть проблемой.

...