在访问NSUserDefaults中存储的值之前,您应该先注册默认值。您可以在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法中完成此操作。
注册您的默认值很快,因此无需进行优化。只需在应用程序启动时执行即可。
我将我的用户默认设置存储在一个plist文件中,并像这样注册列表的内容:
NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultUserDefaults" ofType:@"plist"]]
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary]
如果您像这样注册默认值,则无需担心覆盖用户提供的值。NSUserdefaults使用“域”存储其值。如果您注册了默认值,则它们将存储在注册域中。如果用户存储值,则这些值存储在应用程序域中。
如果尝试从NSUserdefaults获取值,则会查看该值是否存在于应用程序域中,如果不存在,则从注册域中获取该值。
编辑:
![plist editor](https://istack.dev59.com/C51Lq.webp)
您可以像这样访问这些值(或更好的是,存储在您的nsuserdefaults中的值,并作为没有用户提供的值的后备):
NSInteger minutesToWait = [[NSUserDefaults standardUserDefaults] integerForKey:@"MinutesToWait"
NSString *urlString = [[NSUserDefaults standardUserDefaults] stringForKey:@"DefaultURLStr"]
plist只是另一种带有键和值的NSDictionary表示形式。键与访问用户默认值时使用的键相同,而值则是您的默认值。
非常简单明了。
无论您如何创建字典,都没有关系。您也可以在代码中创建它。
- (void)applicationDidFinishLaunching:(UIApplication *)application
中还是必须在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
中出现呢?是否有某种原因呢? - Bill Shiff