我试图将数组保存到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"]];
最佳答案
前言:理解用户默认值不是通用数据库。除非你建议存储的数据很小,否则我强烈劝阻你不要这么做。另一种方法是将数据存储在定义良好的位置,例如应用程序支持目录。
编辑
在上一段中,我已经声明应用程序支持目录不应该用于将要更改的数据。我找不到任何东西来支持这一点。苹果公司自己的文档指出,它是“应用程序存储支持应用程序的任何类型的文件,但不需要应用程序运行”,用户数据不应该存储在那里,并且每个应用程序应该在其内部创建和维护自己的目录,而不是写入其顶层。我完全不知道我是从哪里学来这篇小说的,很抱歉我把它延续了下来。
结束编辑
也就是说,当编译器抱怨“非属性值”时,这意味着您试图编写的东西不是NSArray,
NSDictionary,
NSString,
NSData,
NSDate
NSNumber.
NSCoding
或NSKeyedArchiver
正确的是,您自己的对象需要使用nskeyedarchiver和nskeyedunarchiver。但仅仅因为在模型对象中实现了NSData
方法,并不能改变它不是属性列表值的事实。
您需要做的是在尝试存储每个对象之前使用。这将生成的实例,该实例可以存储为属性列表对象。
关于objective-c - 将NSMutableArray保存到NSUserDefaults,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16169659/