是否有更好的方法将一堆东西放入NSUserDefaults?

时间:2009-06-25 03:13:27

标签: iphone objective-c cocoa cocoa-touch

我对iPhone上的NSUserDefaults感到困惑。

我来自C / asm背景,而Objective-C则是一种学习经验。

我目前正在使用NSUserDefaults来存储一些字符串(对于高分表中的名称)。我想开始实施“保存游戏”类型功能,这样如果用户接到电话或退出游戏片刻,他们就可以回来了。

为了恢复游戏,我有几个BOOL标志,几个int来存储一些必要的变量,但是我被困在我需要存储的数组中。

我有一个50个元素的unsigned char数组。我可以把它移到int,如果它会让事情变得更容易,但我只是没有看到它。

要使用NSUserDefaults我可以setBool(已经这样做了),setFloat(再次,已经这样做了),setIntegersetObject

显然,我可以为数组的每个元素声明键,然后用setInteger一个一个地存储它们,但那真的很笨拙。解决这个问题的最佳方法是什么?我试图使用unsigned char而不是NSObject的数组?是否有关于NSObject的任何好的教程,我可以通读,以便更好地理解它?

5 个答案:

答案 0 :(得分:5)

物业清单会更符合您的目标吗?

您可以为每个设置或数组创建字典,存储值,然后将其转储到Property List。您可以轻松读取它们或根据键更新值。

http://developer.apple.com/documentation/Cocoa/Conceptual/PropertyLists/...

答案 1 :(得分:2)

您可以使用NSArrayNSDictionaryNSUserDefaults传递给setObject:forKey:。它工作得很好。显然,你的无符号字符数组必须成为NSArray的{​​{1}},这意味着一些开销,但它可能是你最简单的选择。

答案 2 :(得分:1)

尝试使用NSData对象,该对象可以直接存储到NSUserDefaults

[[NSUserDefaults standardUserDefaults] setObject:[NSData dataWithBytes:array length:len]
                                          forKey:@"someArray"];

答案 3 :(得分:0)

哇那里,你应该真正考虑使用Core Data(或者只是sqllite)来存储游戏状态。 NSUserDefaults用于说 - 默认值,配置设置。它并不意味着存储大量的二进制数据。

答案 4 :(得分:0)

将50个C元素的无符号字符转换为NSArray,您可以使用以下命令存储在NSUserDefaults中:

NSMutableArray* a = [NSMutableArray new];
for ( int i = 0; i < 50; ++i ) {
    [a addObject:[NSNumber numberWithInteger:yourArray[i]]];
}
[[NSUserDefaults standardUserDefaults] setObject:a forKey:@"theArray"];
[a release];

将其取回:

NSArray* a = [[NSUserDefaults standardUserDefaults] objectForKey:@"theArray"];
for ( int i = 0; i < 50; ++i ) {
    yourArray[i] = [[a objectAtIndex:i] integerValue];
}

使用NSUserDefaults存储游戏状态肯定没有问题,而不是在它如此小的时候。如果您的游戏状态是幽默的,您可能希望将其存储为plist文件,但NSUserDefaults不会破坏处理这些微不足道的数据。