我想一个数组保存到NSUserDefaults
。 我读到我必须使用一个编码器和解码器,但我仍然得到同样的错误保存的NSMutableArray NSUserDefaults的到
*** -[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value '(
"<Item: 0x1e86e380>",
"<Item: 0x1e86fd60>",
"<Item: 0x1e86fda0>",
"<Item: 0x1e86fde0>",
"<Item: 0x1e86fe10>"
)' of class '__NSArrayM'. Note that dictionaries and arrays in property lists must also contain only property values.
[unknown][unknown][unknown][unknown][unknown](gdb)
为什么?
这里是我的代码:
这是我的模型。它有NSStrings
,NSNumbers
和NSMutableArrays
:
- (void)encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeObject: self.title forKey:@"title"];
[encoder encodeObject: self.desc forKey:@"desc"];
[encoder encodeObject: (NSNumber*) self.day forKey:@"day"];
[encoder encodeObject: self.images forKey:@"images"];
}
- (id)initWithCoder:(NSCoder *)decoder
{
self = [super init];
if(self != nil)
{
self.title = [decoder decodeObjectForKey: @"title"];
self.desc = [decoder decodeObjectForKey: @"desc"];
self.day = [decoder decodeObjectForKey: @"day"];
self.images = [decoder decodeObjectForKey: @"images"];
}
return self;
}
这是在AppDelegate中的DidFinishLaunching
方法:
if([[NSUserDefaults standardUserDefaults] objectForKey:@"savedData"] == nil)
{
items = [[NSMutableArray alloc] init];
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"items" ofType:@"json"];
NSString *contents = [NSString stringWithContentsOfFile: filePath encoding: NSUTF8StringEncoding error: nil];
SBJsonParser *jsonParser = [[SBJsonParser alloc] init];
NSMutableDictionary *json = [jsonParser objectWithString: contents];
jsonParser = nil;
items = json[@"item"];
for(NSDictionary *itemDict in items)
{
Item *item = [[Item alloc] init];
item.title = [itemDict valueForKey:@"title"];
item.desc = [itemDict valueForKey:@"description"];
item.day = [itemDict valueForKey:@"day"];
item.images = [itemDict valueForKey: @"images"];
[items addObject: item];
}
}
else
{
NSData *decodedObject = [userDefault objectForKey: [NSString stringWithFormat:@"savedData"]];
NSArray *decodedArray =[NSKeyedUnarchiver unarchiveObjectWithData: decodedObject];
items = [decodedArray mutableCopy];
}
这个我有AppWillTerminate
:
userDefault = [NSUserDefaults standardUserDefaults];
NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject: items];
[userDefault setObject: encodedObject forKey:[NSString stringWithFormat:@"savedData"]];
我不认为这个异常来源于你所示的代码。在Xcode中添加一个异常断点。我怀疑你在项目的其他地方使用了'setObject:forKey:'和'Item'(非属性列表对象)。 – omz 2013-04-23 13:18:31
是的。当我删除代码中的错误消失.. – Jojo 2013-04-23 13:37:20
只能存储内置的对象类型值NSUserDefault,如果你试图存储自定义(用户定义的对象),它会产生错误,所以请存储内置在对象 – 2013-04-23 16:52:25