Проблема с использованием decodeObjectForKey? - PullRequest
0 голосов
/ 16 марта 2010

Я пытаюсь узнать, как работает NSCoding, но, похоже, у меня возникла проблема, когда я пытаюсь получить доступ к ранее заархивированному объекту, вот что я делаю ...

// 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;
}

любая помощь будет высоко ценится.

1012 * Гэри *

1 Ответ

2 голосов
/ 16 марта 2010

После того как вы позвонили finishDecoding, вы не можете тогда позвонить decodeObjectForKey:.Вы, очевидно, еще не «закончили декодирование».Вы звоните finishDecoding, когда закончите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...