2010-03-16 16 views
0

我努力學習NSCoding是如何工作的,但似乎已經翻過來當我試着unachive之前存檔對象的問題,這是我在做什麼...使用decodeObjectForKey問題?

// CREATE EARTH & ADD MOON 
Planet *newPlanet_002 = [[Planet alloc] init]; 
[newPlanet_002 setName:@"Earth"]; 
[newPlanet_002 setType:@"Terrestrial Planet"]; 
[newPlanet_002 setMass:[NSNumber numberWithInt:1]]; 
[newPlanet_002 addMoon:[moonsOfEarth objectAtIndex:0]]; 

// ARCHIVE PLANET OBJECTS (Save) 
NSMutableData *data = [[NSMutableData alloc] init]; 
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 
[archiver encodeObject:newPlanet_002 forKey:@"EARTH"]; 
[archiver finishEncoding]; 

BOOL success = [data writeToFile:PathName atomically:YES]; 
if(success == YES) NSLog(@"Write: OK"); 
[archiver release]; 
[data release]; 

// UNARCHIVE PLANET EARTH (Load) 
NSData *dataStore = [[NSData alloc] initWithContentsOfFile:PathName]; 
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:dataStore]; 
[unarchiver finishDecoding]; 

Planet *savedPlanet = [unarchiver decodeObjectForKey:@"EARTH"]; 

的問題似乎是上面的最後一行,我想我錯了。我的類是什麼樣子......

@interface Planet : NSObject <NSCoding> 
{ 
    NSString *name; 
    NSString *type; 
    NSNumber *mass; 
    NSMutableArray *moons; 
} 
@property(retain, nonatomic) NSString *name; 
@property(retain, nonatomic) NSString *type; 
@property(retain, nonatomic) NSNumber *mass; 
@property(retain, nonatomic) NSMutableArray *moons; 

和我的initWithCoder這樣的...

-(id)initWithCoder:(NSCoder *)aDecoder { 
    NSLog(@"_initWithCoder:"); 
    self = [super init]; 
    if(self) { 
     [self setName:[aDecoder decodeObjectForKey:@"NAME"]]; 
     [self setType:[aDecoder decodeObjectForKey:@"TYPE"]]; 
     [self setMass:[aDecoder decodeObjectForKey:@"MASS"]]; 
     [self setMoons:[aDecoder decodeObjectForKey:@"MOONS"]]; 
    } 
    return self; 
} 

任何幫助,將不勝感激。

加里

+1

你能詳細說明「這個問題嗎?」你有錯誤嗎?碰撞?一個零? – 2010-03-16 15:21:31

回答

2

一旦你叫finishDecoding,你不能再調用decodeObjectForKey:。你顯然還沒有「完成解碼」。完成後請致電finishDecoding

+0

謝謝Rob,對不起傻乎乎的錯誤,我有點頭腦中認爲解碼是設置NSData對象的實際設置,然後將它分配給一個對象,有點像編碼完成編碼,然後寫入磁盤。非常感激。 – fuzzygoat 2010-03-16 15:44:29