在我的应用程序中,从多个类向NSUserDefaults注册默认值是否可以?

9

我已经了解到使用 NSUserDefaults 来保存应用程序的偏好设置到文件系统中的方法。 我也知道在使用偏好设置之前需要先注册默认值。

但是,我不确定是否可以从我的应用程序的各个类中注册默认值。例如,在 AppDelegate 中,我想要注册适用于整个应用程序的偏好设置,但是在主题类中,我只想要使用(并因此注册)用于获取和设置应用程序主题的偏好设置。多个类将根据其用户偏好有自己的需求,因此这适用于我所工作的任何项目的多个部分。

以这种方式将偏好设置与它们所属的类一起保留,这是否是正确的工作方式?

4个回答

14

是的,您可以从多个类注册默认值。当您注册新的默认值时,它只会将该新的键/值对添加到注册域中(应用程序只有一个这样的域)。我认为您现在的做法相当合理。


2
谢谢您实际回答我的真正问题,这个问题是关于在我的应用程序中从许多部分注册默认值,而不仅仅是设置和获取它们(我完全理解这是可能的)。 现在,我可以在某个类的init中注册该类需要的默认值,而不必担心我的应用程序中其他类可能会做什么,这就是面向对象编程的正确方式,对吧? - Richard Altenburg - Brainchild
1
那是我的理解,在测试中,它似乎工作得很好。 - rdelmar

2

NSUserDefaults与整个应用程序相关。因此,无论您在何处读取/存储它们,都不重要:即使在另一个类中设置,键也将对任何类可见。

我个人尝试使用自己的方案,以便相关首选项可以“接近”。

例如:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:themePreferences forKey:@"Theme"];
[defaults setObject:otherPreferences forKey:@"Other"];

希望这能帮到你。

1
我知道用户默认设置可以从整个应用程序中读取和写入,但我的真正问题是是否可以在应用程序的多个位置注册它们,还是必须在一次调用registerDefaults中传递完整的默认字典? - Richard Altenburg - Brainchild
你是否担心在持有用户默认值时会占用过多内存,或者你想要在一行中调用这些默认值?如果你的顾虑不是这两个问题,请说明具体情况以便我们提供帮助。 - Bartu
你可以两者兼顾。试着把它想象成一个共享的字典,这样你就可以同时设置所有偏好设置,或仅设置/读取其中的一部分。当然,如果你计划在单个调用中全部写入它们,你应该意识到你可能会失去代码中另一个类写入的先前数据。 - NovaOverflow
1
内存不是我的问题,我也不想从一行中注册它们所有。相反,我想在需要它的类中注册一个默认值,以便在我的应用程序的多个地方使用。@rdelmar为我解决了这个问题,我今天会编写代码,如果仍然出现任何问题,我会回到这里提供更多细节... - Richard Altenburg - Brainchild

1

这并非必须,但如果您想按类别分区偏好设置文件,可以将类名作为键的一部分。例如:

NSString *prefKey = [ NSString stringWithFormat: @"%s.prefName", (const char *) class_getName([ self class ]) ];

其中prefName是您存储任何偏好设置的名称。这样,您可以在不同的类中使用相同的偏好设置名称,而不必担心它们互相覆盖。但正如其他人所说,除非您有特定的需求,否则可以从应用程序的任何地方调用NSUserDefaults


0

如果您使用[NSUserDefaults standardUserDefaults],那么它将在整个应用程序中共享。您可以使用自己的默认类来进行特定类别的设置。


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