2010-08-07 3 views
1

를 호출하지 않습니다NSKeyedUnarchiver 내가 다음 예제를 사용했습니다 initWithCoder

game state singleton cocos2d, initWithEncoder always returns null

대신 파일을 사용하는, 내가 NSUserDefaults에서 무엇입니까있는 NSData 객체를 사용합니다. 그것은 null이 아니라 오히려 내가 올바르게 인코딩 된 데이터라고 생각하는 데이터가 있고 unarchiveObjectWithData를 실행할 때 initWithCoder를 호출하지 않아서 NSLog를 첫 번째 줄에 넣었습니다.

아이디어가 있으십니까?

+ (void)loadState { 
@synchronized([AppStateManager class]) { 
    if (!sharedAppStateManager) { 
    [AppStateManager sharedManager]; 
    } 

    NSUserDefaults *udefs = [NSUserDefaults standardUserDefaults]; 
    NSData *archivedData = [udefs objectForKey:@"AppState"]; 
    NSLog(@"going to unarchive"); 
    [NSKeyedUnarchiver unarchiveObjectWithData:archivedData]; 
    NSLog(@"unarchive complete"); 
} 
} 

- (id)initWithCoder:(NSCoder *)decoder { 
NSLog(@"init coder"); 
self = [super init]; 
if (self != nil) { 
    [self setUsername:[decoder decodeObjectWithKey:@"username"]]; 
} 

return self; 
} 
+0

보관 처리자가 예외를 throw합니까? 그렇지 않으면 객체를 반환합니까? 객체를 반환하면 어떤 클래스입니까? –

답변

2

해결.

위의 링크에 게시 된 예제는 allocWithZone 메서드를 사용하여 "sharedInstance"를 통해 개체를 초기화합니다. 객체가 존재하면 nil을 반환합니다.

NSKeyedUnarchiver는 allocWithZone을 통해 AGAIN을 할당하려고 시도합니다. 객체가 이미 동일한 메소드에서 이미 초기화되었거나 가끔은 unarchiver가 할당 된 객체 대신 nil을 가져 오기도합니다.

희망이 있으면 도움이됩니다.

+0

이것은 아마도 내 문제입니다. 감사합니다.인코딩 및 디코딩을 고수 할 것입니다. – SpacyRicochet

0

이것은 비슷한 문제를 해결하는 동안 발견 한 추가 정보는 아니지만 약간의 추가 정보입니다. 나는 신인 상태에 처한 것 같아서이 게시물에 기여할 수있는 유일한 방법입니다.

어쨌든 ... ...이 문제를 두드리는 순전히 특히 여기 감사 : http://www.cocos2d-iphone.org/forum/topic/11327

나는이 방법을 사용하여 작업 변경 가능한 배열에 문제가 있었다 당신이 밖으로 일했던 곳에는 것 파일에서 unarchived 후 불변의 배열로 전환하십시오.

반환되는 배열을 가변형 버전으로 캐스팅해도 작동하지 않습니다. 나는 결국 내 가변 배열에 objectsFromArray를 추가하고 이것이 내 문제를 해결했다.

는 근무 :

[self.mutableArray addObjectsFromArray:[decoder decodeObjectForKey:@"MutableArray"]]; 

중 어느 것도 이러한 일 :

self.mutableArray = [decoder decodeObjectForKey:@"MutableArray"]; 

self.mutableArray = (NSMutableArray *)[decoder decodeObjectForKey:@"MutableArray"]; 
+0

옆으로 : fyi (당신은 신인이라고 언급했기 때문에) NSMutableArray 로의 캐스트는 실행되는 코드를 변경하지 않으며 컴파일러가 발행 할 수있는 모든 유형 경고에만 영향을 미칩니다. – bshirley

2

나는 이유는 모르겠지만, 내가 할 후이 내 아카이브의 NSData (내용을 얻기 위해 그 중 내가 생각) 하찮은이다 : 나는 이것을 실행하면

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
NSData *encodedConfig = [userDefaults valueForKey:kConfiguration]; 

, 그것은을 반환3210.

NSArray *configs = [NSKeyedUnarchiver unarchiveObjectWithData:encodedConfig]; 

그러나 이것을 실행할 때 예상되는 이전에 보관 된 개체 배열을 얻습니다.

NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:encodedConfig]; 
NSArray *configs = [unarchiver decodeObject]; 

이 두 가지 접근 방식에서 동일한 동작이 기대됩니다. 내 유일한 응답은 unarchiveObjectWithData:이 아닙니다.

+0

당신은 선생님입니다. 확실히 narch가 아닌 unarchiveObjectWithData에 문제가 있습니다 ... 그리고 initForReadingWithData를 사용할 때 작동합니다 ... – Orbitus007

관련 문제