2009-12-11 2 views
0

배열에 NSUserDefaults에 저장하고 있는데, NSCoding 프로토콜을 준수하는 Assignment 클래스를 포함하고 있습니다. 배열은 올바르게 저장되고로드되며 배열의 검색된 첫 번째 객체가 할당 클래스임을 확인할 수 있습니다. 문제는 배열에서 Assignment 객체의 ivars에 액세스하려고 할 때 발생합니다. 충돌이 발생하고 다음 오류가 발생합니다.NSKeyedUnarchiver 개체에 문제가 있습니까?

*** -[CFString respondsToSelector:]: message sent to deallocated instance 0x3948d60 

다음은 사용자 기본값으로 저장하는 데 사용하는 코드입니다. 또한 디버깅 목적으로 저장된 객체를 검색하고 확인합니다.

-(void)saveToUserDefaults:(NSArray*)myArray 
{ 
    NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; 

    if (standardUserDefaults) { 
     [standardUserDefaults setObject:[NSKeyedArchiver archivedDataWithRootObject:myArray] forKey:@"Assignments"]; 
     [standardUserDefaults synchronize]; 
    } 
    NSLog(@"Assignments array saved. (%d assignments in array)",[myArray count]); 
    NSData *dataCheck = [[NSData alloc] initWithData:[standardUserDefaults objectForKey:@"Assignments"]]; 
    NSArray *arrayCheck = [[NSArray alloc] initWithArray:[NSKeyedUnarchiver unarchiveObjectWithData:dataCheck]]; 
    NSLog(@"Checking saved array (%d assignments in array)",[arrayCheck count]); 
    if ([[arrayCheck objectAtIndex:0] isKindOfClass:[Assignment class]]) { 
     NSLog(@"It's of the class Assignment."); 
    } 
    Assignment *testAssignment = [[Assignment alloc] initWithAssignment:[arrayCheck objectAtIndex:0]]; 
    NSLog(@"Title: %@ Course: %@",[testAssignment title],[testAssignment course]); 
} 

크래시가 발생하는 testAssignment를 할당하기 전까지는 문제가 없습니다. 누구든지 아이디어가 있습니까?

편집 :

- (void)encodeWithCoder:(NSCoder *)coder { 
    [coder encodeObject:title forKey:@"title"]; 
    [coder encodeObject:course forKey:@"course"]; 
    [coder encodeObject:dueDate forKey:@"dueDate"]; 
    [coder encodeObject:notes forKey:@"notes"]; 
} 

- (id)initWithCoder:(NSCoder *)coder { 
    self = [[Assignment alloc] init]; 
    if (self != nil) 
    { 
     title = [coder decodeObjectForKey:@"title"]; 
     course = [coder decodeObjectForKey:@"course"]; 
     dueDate = [coder decodeObjectForKey:@"dueDate"]; 
     notes = [coder decodeObjectForKey:@"notes"]; 
    } 
    return self; 
} 

답변

3

내 자신의 질문에 대답 : 여기에 할당 클래스 내 NSCoding 방법이다.

//Example  
title = [[coder decodeObjectForKey:@"title"] retain]; 

이제 모든 아름답게 작동합니다 initWithCoder에서, 나는 디코딩 된 모든 개체를 유지하기 위해 필요합니다. :)

+1

속성을 정의한 경우 self. 을 사용하여 암시 적으로 유지할 수 있습니다. 즉, self.title = [coder decodeObjectForKey : @ "title"]; –

+1

이것은 initWithCoder : 메소드 내부의 객체를 포함하여 모든 객체를 의미합니다. 따라서 보관자가 릴리즈 할 때 segfaulting을한다면, 오브젝트 내부의 오브젝트와 오브젝트 내부의 오브젝트 및 오브젝트 내부의 오브젝트가 모두 아카이브 해제 상태로 유지되는지 확인하십시오. – Tustin2121

+0

@ 벤 Jakuben : 고마워, 그게 나를 위해 작동합니다. – Vjlakshmi