NSUserDefaults NSObject与NSArray对象

Rah*_*diq 7 iphone nsuserdefaults nscoding

我试图保存对象NSUserDefaults,在这个网站上经历了很多问题,但无法解决问题,我NSObjectNSMutableArray另一个对象.像这里的主要对象是HotelDC,它有一个数组"features"一个FeactureDC对象数组.

这是我的代码:

- (id)initWithCoder:(NSCoder *)decoder {
self = [[HotelDC alloc] init];
if (self != nil) {

    self.hotel_id = [decoder decodeIntegerForKey:@"hotel_id"];
    self.name = [decoder decodeObjectForKey:@"name"];
    self.features = [decoder decodeObjectForKey:@"features"];

}
return self;
}

- (void)encodeWithCoder:(NSCoder *)encoder {

[encoder encodeInt:hotel_id forKey:@"hotel_id"];
[encoder encodeObject:name forKey:@"name"];
[encoder encodeObject:features forKey:@"features"];//its a mutable array
}
Run Code Online (Sandbox Code Playgroud)

我该如何保存它并检索?我收到错误了

 Attempt to insert non-property value '<HotelDC: 0xa600fe0>' of class 'HotelDC'. 
 Note that dictionaries and arrays in property lists must also contain only property values.
Run Code Online (Sandbox Code Playgroud)

方案:

//Setting
NSData *myEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:hotelObjSelected];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:myEncodedObject forKey:@"selectHotelObject"];

[[NSUserDefaults standardUserDefaults] synchronize];

// retrieving
NSData *data = [defaults objectForKey:@"selectHotelObject"];
hotelObjSelected = [NSKeyedUnarchiver unarchiveObjectWithData:data];
Run Code Online (Sandbox Code Playgroud)

Ada*_*ght 3

NSUserDefaults有财产清单支持。唉,属性列表不能包含序列化对象。引用手册

默认对象必须是属性列表,即 NSData、NSString、NSNumber、NSDate、NSArray 或 NSDictionary 的实例(或集合的实例组合)。如果您想存储任何其他类型的对象,通常应该将其存档以创建 NSData 的实例

您必须创建自己的序列化数据文件来直接保存对象,或者将对象序列化为允许的类型之一。令人讨厌的是,它NSUserDefaults不调用encodeWithCoder- 它只是筛选传递给 的对象类型setObject:forKey:。最好的选择是序列化您自己的字段HotelDC,或者将对象归档到NSData实例并存储它。