2010-03-16 17 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