我对iPhone上的NSUserDefaults
感到困惑。
我来自C / asm背景,而Objective-C则是一种学习经验。
我目前正在使用NSUserDefaults
来存储一些字符串(对于高分表中的名称)。我想开始实施“保存游戏”类型功能,这样如果用户接到电话或退出游戏片刻,他们就可以回来了。
为了恢复游戏,我有几个BOOL
标志,几个int
来存储一些必要的变量,但是我被困在我需要存储的数组中。
我有一个50个元素的unsigned char
数组。我可以把它移到int
,如果它会让事情变得更容易,但我只是没有看到它。
要使用NSUserDefaults
我可以setBool
(已经这样做了),setFloat
(再次,已经这样做了),setInteger
和setObject
。
显然,我可以为数组的每个元素声明键,然后用setInteger
一个一个地存储它们,但那真的很笨拙。解决这个问题的最佳方法是什么?我试图使用unsigned char
而不是NSObject
的数组?是否有关于NSObject
的任何好的教程,我可以通读,以便更好地理解它?
答案 0 :(得分:5)
物业清单会更符合您的目标吗?
您可以为每个设置或数组创建字典,存储值,然后将其转储到Property List。您可以轻松读取它们或根据键更新值。
http://developer.apple.com/documentation/Cocoa/Conceptual/PropertyLists/...
答案 1 :(得分:2)
您可以使用NSArray
将NSDictionary
或NSUserDefaults
传递给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不会破坏处理这些微不足道的数据。