【问题标题】:Is there a better way to put a bunch of stuff in NSUserDefaults?有没有更好的方法将一堆东西放在 NSUserDefaults 中?
【发布时间】:2009-06-25 03:13:27
【问题描述】:

我对 iPhone 上的 NSUserDefaults 感到困惑。

我来自 C / asm 背景,并且学习了 Objective-C 的东西。

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

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

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

要与NSUserDefaults 合作,我可以使用setBool(已经这样做了)、setFloat(再说一遍,已经这样做了)、setIntegersetObject

显然,我可以为数组的每个元素声明键,并用setInteger 将它们一一存储,但这真的很笨拙。解决这个问题的最佳方法是什么?而不是unsigned chars 的数组,我以某种方式尝试使用NSObject? NSObjects 上是否有任何好的教程可供我阅读以更好地理解它?

【问题讨论】:

    标签: iphone objective-c cocoa cocoa-touch


    【解决方案1】:

    属性列表会更适合您想要实现的目标吗?

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

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

    【讨论】:

    • 是的,通常您会使用 NSUserDefaults 进行偏好设置(例如选择英制单位还是公制单位),并使用序列化属性列表、sqlite、Core Data 等将应用程序的数据存储在单独的文件中。跨度>
    • 同意,用户默认设置为首选项,但数据应存储在其他位置,例如“~/Library/Application Support/MyApp/”中的 plist。
    • 在 iPhone 上,存储数据的约定明显不同,因为结构非常不同。有关为您的应用存储文件的详细信息,请参阅相关的 iPhone 编程指南。
    • 在 iPhone 上,您只能在应用程序包中访问,但您仍然可以使用任何方法(道具列表、sqlite、核心数据等)。
    • 好的,我会调查这一切的。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        哇,你真的应该考虑使用 Core Data(或只是 sqllite)来存储游戏状态。 NSUserDefaults 用于说明 - 默认值、配置设置。它并不是真的要存储大块的二进制数据。

        【讨论】:

          【解决方案5】:

          要将 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 处理这些微不足道的数据不会费力。

          【讨论】:

          • 感谢您的代码和推荐。我试试看。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-09
          • 1970-01-01
          • 2010-10-09
          • 1970-01-01
          • 2013-04-29
          相关资源
          最近更新 更多