г. У Шарбонно правильная идея. NSCoder
абстрагирует конкретную сериализацию вашего объекта и позволяет вам беспокоиться только о том, что нужно сериализовать / десериализовать. В -encodeWithCoder:
вы можете захотеть
NSAssert1([encoder allowsKeyedCoding],
@"%@ does not support sequential archiving.",
[self className]);
, поскольку не все кодировщики поддерживают архивирование на ключах.
В -initWithCoder
вы должны отправить -initWithCoder:
- а не просто -init
- на super
до инициализации вашего объекта:
self = [super initWithCoder:decoder];
if (!self) return nil;
// now use the coder to initialize your state
В качестве альтернативы, поскольку ваш объект уже является списком свойств, вы можете добавить что-то вроде -[Person plistRepresentation]
:
- (NSDictionary *)plistRepresentation
{
return [NSDictionary dictionaryWithObjectsAndKeys:
[self firstName], @"firstName",
[self lastName], @"lastName",
[NSNumber numberWithInteger:[self age]], @"age", nil];
}
Затем, чтобы сериализовать массив Person
s, вы можете сами преобразовать людей в plistRepresentation
и затем использовать -[NSArray writeToURL:atomically:]
. (Конечно, вы также можете использовать методы NSProperyListSerialization
напрямую.)