Question

I'm trying to save the objects called blobs using NSKeyedArchiver. I use NSMutableData and NSKeyedArchiver to save the data onto a file that represents that object. then I use NSData and NSKeyedUnarchiver to get the data from the files.

It seems to work out fine with no errors but when I load it all of the properties are "0" or nil.

Why is this?

-(void) LoadBlobs
{
    [blobs release];
    blobs = nil;
    blobs = [[NSMutableArray alloc]init];
    NSNumber *blobAmounts = [[NSUserDefaults standardUserDefaults]objectForKey:blobAmount];

    if([blobAmounts intValue] <= 0)
    {
        return;
    }

    for(int i = 0; i < [blobAmounts intValue]; i++)
    {
        NSLog(@"Loading Blob #%i...", i);
        NSString *curBlobDirectory = [[NSString alloc]initWithFormat:@"%@%i", saveDirectoryBlobs, i];
        NSLog(@"Blob directory is: %@", curBlobDirectory);

        NSData *blobData = [[NSData alloc]initWithContentsOfFile:curBlobDirectory];
        NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:blobData];

        Blob *b = [[Blob alloc]initWithFile:@"Blob.png"];
        b.position = CGPointMake([[unarchiver decodeObjectForKey:@"x"]intValue], [[unarchiver decodeObjectForKey:@"y"]intValue]);
        b.health = [[unarchiver decodeObjectForKey:@"health"]intValue];
        b.mating = [[unarchiver decodeObjectForKey:@"mating"]intValue];
        b.aiEntity = [[unarchiver decodeObjectForKey:@"entity"]intValue];
        b.action = [[unarchiver decodeObjectForKey:@"action"]intValue];
        b.faction = [[unarchiver decodeObjectForKey:@"faction"]intValue];
        b.equippedHelmet = [[unarchiver decodeObjectForKey:@"helmet"]boolValue];
        b.equippedSpear = [[unarchiver decodeObjectForKey:@"spear"]boolValue];
        b.goingTo = CGPointMake([[unarchiver decodeObjectForKey:@"gx"]intValue], [[unarchiver decodeObjectForKey:@"gy"]intValue]);
        b.homeID = [[unarchiver decodeObjectForKey:@"home"]intValue];
        b.aiID = [[unarchiver decodeObjectForKey:@"ai"]intValue];
        b.iD = [[unarchiver decodeObjectForKey:@"id"]intValue];

        NSLog(@"Blob #%i properties are: %f, %i, %i, %i, %i, %i, %i", i, b.health, b.mating, b.aiEntity, b.faction, b.action, b.equippedHelmet, b.equippedSpear);

        [blobs addObject:b];
        [self addChild:b z:1];

        [unarchiver finishDecoding];

        [blobData release];
        [curBlobDirectory release];
        [unarchiver release];
    }
    NSLog(@"%i blobs successfully loaded!", [blobs count]);
}

-(void) SaveBlobs
{
    [[NSUserDefaults standardUserDefaults]setValue:[NSNumber numberWithBool:true] forKey:gameSavedPrev];

    int i = 0;
    for(Blob *b in blobs)
    {
        NSLog(@"Saving Blob #%i...", i);

        NSString *curBlobDirectory = [[NSString alloc]initWithFormat:@"%@%i", saveDirectoryBlobs, i];

        NSMutableData *blobData = [[NSMutableData alloc]init];
        NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:blobData];

        [archiver encodeInt:b.position.x forKey:@"x"];
        [archiver encodeInt:b.position.y forKey:@"y"];
        [archiver encodeInt:b.health forKey:@"health"];
        [archiver encodeInt:b.mating forKey:@"mating"];
        [archiver encodeInt:b.aiEntity forKey:@"entity"];
        [archiver encodeInt:b.action forKey:@"action"];
        [archiver encodeInt:b.faction forKey:@"faction"];
        [archiver encodeBool:b.equippedHelmet forKey:@"helmet"];
        [archiver encodeBool:b.equippedSpear forKey:@"spear"];
        [archiver encodeInt:b.position.x forKey:@"gx"];
        [archiver encodeInt:b.position.y forKey:@"gy"];
        [archiver encodeInt:b.homeID forKey:@"home"];
        [archiver encodeInt:b.aiID forKey:@"ai"];
        [archiver encodeInt:b.iD forKey:@"id"];

        [archiver finishEncoding];

        BOOL success = [blobData writeToFile:curBlobDirectory atomically:YES];
        NSLog(@"Blob directory is: %@", curBlobDirectory);

        [archiver release];
        [blobData release];
        [curBlobDirectory release];

        i++;
    }
}
Was it helpful?

Solution

replace everything that is like

b.health = [[unarchiver decodeObjectForKey:@"health"]intValue];

with

b.health = [unarchiver decodeIntForKey:@"health"];

If you use encodeInt:forKey: you have to use decodeIntForKey:.
If you use encodeBool:forKey: you have to usedecodeBoolForKey:`.

and so on

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top