2013-04-23 1 views
3

배열을 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, NSNumbersNSMutableArrays이 있습니다

- (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"]]; 
+0

이 예외는 표시된 코드에서 비롯된 것이라고 생각하지 않습니다. Xcode에 예외 중단 점을 추가하십시오. 나는 당신이 프로젝트의 다른 곳에서'Item's (non-property-list objects) 배열을 가지고'setObject : forKey :'를 사용하고 있다고 생각합니다. – omz

+0

예. 그 코드를 제거하면 오류가 사라집니다 .. – Jojo

+0

사용자 정의 (사용자 정의 객체)를 저장하려고하면 NSUserDefault에 객체 유형 값만 저장할 수 있으므로 오류가 발생하므로 내장 객체를 저장하십시오 –

답변

1

서문 : 이해 해당 사용자의 기본 설정을 범용 데이터베이스가 아닙니다. 당신이 거기에 저장할 것을 제안하는 데이터가 아주 작 으면 않는 한, 나는 당신이 이것을하는 것을 강력하게 권장하지 않습니다. 다른 방법으로는 응용 프로그램 지원 디렉토리와 같이 잘 정의 된 위치에 데이터를 저장하는 것입니다. 이전 단락에서

편집

, 나는 응용 프로그램 지원 디렉토리가 변경됩니다 데이터에 사용되어서는 안된다는 주장했다. 나는 이것을지지 할 어떤 것도 찾을 수 없다. Apple의 설명서에 따르면 "앱을 지원하지만 앱을 실행할 필요가없는 모든 유형의 파일을 앱이 저장하는 곳"이며 사용자 데이터는 저장되어서는 안되며 각 앱은 자체 앱을 만들고 유지 관리해야한다고 명시되어 있습니다. 디렉토리를 작성해야합니다. 나는이 소설을 집어 넣은 곳에서 전혀 확신 할 수 없었고, 그것을 영속화 시켜서 유감스럽게 생각합니다.

END EDIT

컴파일러는 "비 속성 값 (들)"을 호소 할 때 당신은 NSArray, NSDictionary, NSString, NSData, NSDate 또는 NSNumber.없는 뭔가를 쓰기를 시도하고 있다는 것을 의미 있음을 의미하며,

자신의 개체가 NSKeyedArchiver 및 NSKeyedUnarchiver를 사용해야하는 것은 맞습니다. 그러나 모델 객체에 NSCoding 메소드를 구현한다고해서 속성 목록 값이 아니라는 사실은 변하지 않습니다.

각 개체를 저장하려고 시도한 후에 NSKeyedArchiver을 사용하기 전에을 저장하려고하면됩니다. 그러면 속성 목록 개체로 저장할 수있는 NSData의 인스턴스가 생성됩니다.

+0

왜 Application Support 폴더를 피하십시오? – omz

관련 문제