0
NSKeyedArchiver를 사용하여 blob이라는 객체를 저장하려고합니다. NSMutableData와 NSKeyedArchiver를 사용하여 해당 개체를 나타내는 파일에 데이터를 저장합니다. 그렇다면 NSData와 NSKeyedUnarchiver를 사용하여 파일에서 데이터를 가져옵니다.NSKeyArchiver를 사용하여 데이터를 저장하지만 NSKeyUnarchiver를 사용하여 데이터를로드 할 때 모두 0 또는 nil이됩니다.
오류없이 정상적으로 작동하지만로드 할 때 모든 속성이 "0"또는 nil입니다.
왜 이런가요? 당신이 encodeInt:forKey:
사용하면 decodeIntForKey:
를 사용해야하는 경우
b.health = [unarchiver decodeIntForKey:@"health"];
와
b.health = [[unarchiver decodeObjectForKey:@"health"]intValue];
처럼
-(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++;
}
}
매우 긴 질문에 답변 해 주셔서 감사합니다. 나는 지금 당장 이것을 시도 할 것이다, 고마워! (많은 코드 읽기 에서처럼) – Telinir