将包含另一个自定义对象的自定义对象保存到NSUserDefaults中

时间:2011-10-27 18:39:18

标签: ios nsuserdefaults

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

1 个答案:

答案 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。