我理解如何在NSUser默认值中存储自定义对象,但是当我尝试在其中保存一个具有不同类型对象的对象时(如果我没有弄错,则称为合成)遵循内部对象的相同步骤正如我为第一个做的那样,我得到了运行时错误。您能否详细描述我必须采取的步骤,以便正确保存和检索所有内容
答案 0 :(得分:4)
所有对象都应该实现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。