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++;
}
}
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 use
decodeBoolForKey:`.
and so on