배열을 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에 예외 중단 점을 추가하십시오. 나는 당신이 프로젝트의 다른 곳에서'Item's (non-property-list objects) 배열을 가지고'setObject : forKey :'를 사용하고 있다고 생각합니다. – omz
예. 그 코드를 제거하면 오류가 사라집니다 .. – Jojo
사용자 정의 (사용자 정의 객체)를 저장하려고하면 NSUserDefault에 객체 유형 값만 저장할 수 있으므로 오류가 발생하므로 내장 객체를 저장하십시오 –