【问题标题】:Using NSKeyArchiver to save data, but when I use NSKeyUnarchiver to load the data it is all 0 or nil使用 NSKeyArchiver 保存数据,但是当我使用 NSKeyUnarchiver 加载数据时,它都是 0 或 nil
【发布时间】:2026-01-21 08:20:10
【问题描述】:

我正在尝试使用 NSKeyedArchiver 保存名为 blob 的对象。 我使用 NSMutableData 和 NSKeyedArchiver 将数据保存到代表该对象的文件中。然后我使用 NSData 和 NSKeyedUnarchiver 从文件中获取数据。

它似乎运行良好,没有错误,但是当我加载它时,所有属性都是“0”或 nil。

这是为什么?

-(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++;
    }
}

【问题讨论】:

    标签: iphone objective-c nsdata nskeyedarchiver nsmutabledata


    【解决方案1】:

    替换所有喜欢的东西

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

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

    如果你使用encodeInt:forKey:,你必须使用decodeIntForKey:
    如果你使用encodeBool:forKey: you have to usedecodeBoolForKey:`。

    等等

    【讨论】:

    • 感谢您抽出宝贵时间回答这个很长的问题!我现在就试试这个,谢谢! (如,大量代码阅读)
    最近更新 更多