Все ваши объекты должны реализовывать протокол NSCoding. NSCoding работает рекурсивно для объектов, которые будут сохранены. Например, у вас есть 2 пользовательских класса
@interface MyClass : NSObject {
}
@property(nonatomic, retain) NSString *myString;
@property(nonatomic, retain) MyAnotherClass *myAnotherClass;
@interface MyAnotherClass : NSObject {
}
@property(nonatomic, retain) NSNumber *myNumber;
Для сохранения объекта MyClass в NSUserDefaults необходимо реализовать протокол NSCoding для обоих этих классов:
Для первого класса:
-(void)encodeWithCoder:(NSCoder *)encoder{
[encoder encodeObject:self.myString forKey:@"myString"];
[encoder encodeObject:self.myAnotherClass forKey:@"myAnotherClass"];
}
-(id)initWithCoder:(NSCoder *)decoder{
self = [super init];
if ( self != nil ) {
self.myString = [decoder decodeObjectForKey:@"myString"];
self.myAnotherClass = [decoder decodeObjectForKey:@"myAnotherClass"];
}
return self;
}
Для второго класса:
-(void)encodeWithCoder:(NSCoder *)encoder{
[encoder encodeObject:self.myNumber forKey:@"myNumber"];
}
-(id)initWithCoder:(NSCoder *)decoder{
self = [super init];
if ( self != nil ) {
self.myNumber = [decoder decodeObjectForKey:@"myNumber"];
}
return self;
}
Обратите внимание, если ваш другой класс (MyAnotherClass выше) также имеет пользовательский объект , тогда этот пользовательский объект должен также реализовать NSCoding. Даже если у вас есть NSArray, который содержит пользовательских объектов , вы должны реализовать NSCoding для этих объектов.