Cocoa 何时(不)滥用默认值

Cocoa 何时(不)滥用默认值,cocoa,limit,nsuserdefaults,options,Cocoa,Limit,Nsuserdefaults,Options,我想知道这些指导原则是为了什么: 1-我多久可以阅读一次NSUserDefaults 2-我可以在NSUserDefaults中合理存储多少数据 显然,可以使用多少NSUserDefaults是有限制的,但我很难确定什么是合理的,什么是不合理的 例如: 如果我的游戏有一个选项让电脑成为玩家之一,我将使用NSUserDefaults保存该布尔值。这一点很清楚。但是,每当我想知道电脑是玩家还是应该使用实例变量来代替时,在我的游戏中访问NSUserDefaults也是合理的吗?假设我需要每秒检查一次

我想知道这些指导原则是为了什么:
1-我多久可以阅读一次NSUserDefaults
2-我可以在NSUserDefaults中合理存储多少数据

显然,可以使用多少NSUserDefaults是有限制的,但我很难确定什么是合理的,什么是不合理的

例如:

  • 如果我的游戏有一个选项让电脑成为玩家之一,我将使用NSUserDefaults保存该布尔值。这一点很清楚。但是,每当我想知道电脑是玩家还是应该使用实例变量来代替时,在我的游戏中访问NSUserDefaults也是合理的吗?假设我需要每秒检查一次布尔值。答案是一样的,是100毫秒吗?每隔10秒怎么样

  • 如果我的游戏有50个移动对象,并且我希望在用户退出应用程序时存储它们的位置和速度,那么NSUserDefault是存储这些数据的合理位置吗?20个移动物体怎么样?200美元怎么样


在NSUserDefault中,数百到数千项都可以(基本上只是围绕属性列表序列化的包装)。关于应用程序的开销,最好的做法是尝试并使用探查器

我想知道这些指导方针的目的是什么: 1-我多久可以阅读一次NSUserDefault

非常经常。期望缺省值的开销类似于线程安全的NSDictionary

2-我可以在NSUserDefaults中合理存储多少数据

身体上,比你需要的更多。逻辑最大值是您需要它的速度,以及它在磁盘上占用的空间。还请记住,在启动/关闭和其他各种时间,此表示是从磁盘读写的

如果我的游戏有一个选项让电脑成为玩家之一,我将使用NSUserDefaults保存该布尔值。这一点很清楚。但是,每当我想知道电脑是玩家还是应该使用实例变量来代替时,在我的游戏中访问NSUserDefaults也是合理的吗

只需向对手对象添加一个
const bool
。零运行时损失,除了内存之外,这不会太大

假设我需要每秒检查一次布尔值。答案是一样的,是100毫秒吗?每隔10秒怎么样

同样,它就像一个线程安全的NSDictionary(散列)。它将是相当快的,并且足够快以那个频率阅读。它是否是最好的设计取决于程序。如果它变得巨大,那么是的,性能将受到影响

如果我的游戏有50个移动对象,并且我希望在用户退出应用程序时存储它们的位置和速度,那么NSUserDefault是存储这些数据的合理位置吗?20个移动物体怎么样?200美元怎么样

这将是好的,虽然我不会读/写通过用户默认在游戏中玩;只需根据需要保存/加载状态


我不建议将所有这些保存在用户默认值中。只需为您的游戏状态创建一个文件表示,并使用用户默认值作为其设计目的。如果它很大,并且您经常写入,那么实现可能会定期将状态刷新到磁盘,这可能需要相对较长的时间。

不要担心限制。相反,问问自己这个简单的问题:

这是一种偏好吗?

如果是首选项,则应为用户默认值。这就是用户默认值的用途。如果没有,那么它应该在Documents目录中(或者,在Mac上,可能在applicationsupport中)

在iOS上,您可以通过是否适合(如果可能的话)将其放在设置包中以在设置应用程序中显示和编辑来判断它是否是首选项。在MacOSX上,您通常可以通过将其放在“首选项”窗口中是否合适来判断它是否是首选项

当然,这取决于你的判断。例如,Mac的节错误地将非首选项放在其首选项窗口中

你也可以通过反问来考虑这个问题:

这是用户创建的数据吗?


您将具有默认值的首选项不是用户创建的数据;它是用户覆盖的数据。丢失它同样糟糕,但它会通知您应该将其保存在哪里。

这里没有人提到的主要性能问题是,用户的主目录可能位于网络卷上,并且可能不是特别快。这不是一个理想的情况,但它确实发生了,所以如果你担心性能,那就是你应该测试的对象

也就是说,
NSUserDefaults
使用内存中的缓存,并且成本仅在同步时发生。根据文档,同步“自动地……以周期性的间隔”进行;不过,我相信这只适用于发生变化的情况


因此,对于检查计算机是否是播放器的情况,使用
NSUserDefaults
一次帧应该不会有问题,因为它是缓存的。对于存储游戏状态,如果您不断更新它,可能会导致性能问题,正如Peter Hosey所说,这是一种语义滥用。

NSUserDefaults基本上是一个包装器,用于从磁盘的.plist文件加载NSDictionary(并将其写入磁盘)。您可以在NSUserDefaults中存储尽可能多的数据,但您无法控制它使用多少内存以及如何从磁盘读取数据

我会对不同的信息/数据使用不同的技术

  • 来自服务器、首选项、用户信息等的少量数据,我将使用NSUserDefaults

  • 对于登录信息(访问令牌、敏感数据),我将使用密钥链。钥匙链还可用于删除应用程序时不应删除的数据

  • 大阿穆