gpt4 book ai didi

ios - NSCoding 和保存/加载默认值问题

转载 作者:可可西里 更新时间:2023-11-01 05:57:28 26 4
gpt4 key购买 nike

我正在为 iPhone 应用程序编写一些代码,但在正确加载默认数据时遇到了问题。我的代码基于 Ray Wenderlich 的“Learning Cocos2d”一书中的一些示例。

似乎即使我彻底删除应用程序并尝试从新数据开始,应用程序也不一致地不尝试加载数据,或者错误地认为有数据,并加载空值。

我正在使用 containsValueForKey 来检查值是否存在,然后加载它或加载一些默认值,但即使在全新安装中,containsValueForKey 也会查找数据并且不会加载默认值。在 xcode 的管理器中,我检查了我设备的文件结构和我指定要保存的文档文件夹,看起来它不包含任何文件,所以我不确定它在抓取什么。

我的猜测是问题与 initWithCoder 函数有关。它有时似乎神秘地经历了这个功能,但并非总是如此。另一个奇怪的事情是当玩家获得高分时我调用了[[GameManager sharedGameManager] save](这里没有显示,但是代码和这个objectiveList完全一样,只是一个int)并且它出现了才能正确保存。

现在是代码:

GC数据库.h

#import <Foundation/Foundation.h>
id loadData(NSString * filename);
void saveData(id theData, NSString *filename);

GC数据库.m

#import "GCDatabase.h"
NSString * pathForFile(NSString *filename) {
// 1
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
// 2
NSString *documentsDirectory = [paths objectAtIndex:0];
// 3
return [documentsDirectory stringByAppendingPathComponent:filename];
}

id loadData(NSString * filename) {

NSString *filePath = pathForFile(filename);
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {

NSData *data = [[[NSData alloc] initWithContentsOfFile:filePath] autorelease];
NSKeyedUnarchiver *unarchiver = [[[NSKeyedUnarchiver alloc] initForReadingWithData:data] autorelease];
id retval = [unarchiver decodeObjectForKey:@"Data"];
[unarchiver finishDecoding];
return retval;
}
return nil;
}

void saveData(id theData, NSString *filename) {

NSMutableData *data = [[[NSMutableData alloc] init] autorelease];
NSKeyedArchiver *archiver = [[[NSKeyedArchiver alloc] initForWritingWithMutableData:data] autorelease];
[archiver encodeObject:theData forKey:@"Data"];
[archiver finishEncoding];
[data writeToFile:pathForFile(filename) atomically:YES];
}

游戏管理器.h

@interface GameManager : NSObject <NSCoding>{
NSMutableArray *objectiveDescriptions;
}
@property (nonatomic, retain) NSMutableArray * objectiveDescriptions;
+(GameManager*)sharedGameManager;
-(void)save;
-(void)load;
-(void)encodeWithCoder:(NSCoder *)encoder;
-(id)initWithCoder:(NSCoder *)decoder;

@end

GameManager.m(我加了load函数,试图强制加载,但是好像不行)

+(GameManager*)sharedGameManager {
@synchronized([GameManager class])
{
if(!sharedGameManager) {
sharedGameManager = [loadData(@"GameManager") retain];
if (!sharedGameManager) {
[[self alloc] init];
}
}
return sharedGameManager;
}
return nil;
}

+(id)alloc {
@synchronized([GameManager class]){
NSAssert(sharedGameManager == nil, @"Attempted to allocate a second instance of the Game Manager singleton");
sharedGameManager = [super alloc];
return sharedGameManager;
}
return nil;
}

- (void)dealloc {
[objectiveList release];
[super dealloc];
}

- (void)save {
saveData(self, @"GameManager");
}

-(void)load {
loadData(@"GameManager");
}

- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:objectiveList forKey:@"objectiveList"];
}

- (id)initWithCoder:(NSCoder *)decoder {
self = [super init];
if (self != nil) {
if ([decoder containsValueForKey:@"objectiveList"]) {
objectiveList = [decoder decodeObjectForKey:@"objectiveList"];
} else {
[objectiveList addObjectsFromArray:[NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5", nil]];
}
}

return self;
}
@end

最佳答案

我没有阅读你的完整代码..但我发现代码中有问题....

您还没有为 objectiveList 数组分配内存。除非并且直到您为数组分配内存,否则不会添加对象...

我想去

 objectiveList = [[NSMutableArray alloc] initWithArray:[NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5", nil]];

代替

    [objectiveList addObjectsFromArray:[NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5", nil]];

检查语法..希望这可能会有所帮助,因为在过去我忘记为数组分配内存时它也困扰着我..并继续添加对象导致空...:)如果它不能解决您的问题,我稍后会完全查找代码.. :)

关于ios - NSCoding 和保存/加载默认值问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10453498/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com