iPhone上是否可以使用NSUserDefaults保存整数数组?

8

在iPhone上是否可以使用NSUserDefaults保存整数数组?我在.h文件中声明了一个数组:int playfield[9][11],它会从文件中获取整数并确定游戏场地的布局。我希望能够有几个存档位置,让用户保存他们的游戏。如果我这样做:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setObject: playfield forKey: @"slot1Save"];

我遇到了指针错误。如果有可能保存整数数组,那么最好的方法是什么,然后再稍后检索它呢?

提前感谢!

4个回答

13

您可以使用NSData包装器保存和检索数组

即(无错误处理)

保存

NSData *data = [NSData dataWithBytes:&playfield length:sizeof(playfield)];
[prefs setObject:data forKey:@"slot1Save"];

装载

NSData *data = [prefs objectForKey:@"slot1Save"];
memcpy(&playfield, data.bytes, data.length);

使用memcpy(&playfield, data.bytes, data.length)似乎可以工作,而不是len.length。感谢您的快速回复! - user21293
1
考虑使用像OSSwapHostToLittleInt和OSSwapLittleToHostInt这样的函数,以防iPhone OS因某种原因改变为大端模式。 - Chris Lundie
@epatel 我使用了你的代码将数组转换为数据并存储在NSUserDefaults中,但我无法将数据转换回数组。使用你的代码是否可能获得相同的数据并返回数组? - Ajay Sharma

8

苹果的NSUserDefaults文档 中得知:

一个默认值必须是属性列表,也就是NSData、NSString、NSNumber、NSDate、NSArray或NSDictionary的实例(对于集合来说,是这些实例的组合)。

这就是为什么你会收到指针错误的原因。

你有几个选项(按推荐使用的顺序):

  1. 在你的应用程序中使用一个NSArrayNSArray来存储playField
  2. playField保留为int数组,但在保存到NSUserDefaults之前将数字填充到NSArray中。
  3. 编写自己的NSArchiver子类,以在整数数组和NSData之间进行转换。

4

您需要将此转换为对象。您可以使用NSArray或NSDictionary。


1
只需使用NSArray而不是普通的C数组,就能轻松解决你的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接