我正在慢慢掌握对象范围以及如何在应用程序中传递它们。 Breadcrumbs示例项目使用NSUserDefaults来存储设置。通过查看app委托代码和在线文档中的代码,我注意到每次运行方法willFinishLaunchingWithOptions时都会实例化defaultsDictionary变量。因此,我假设每次打开示例项目时,如果我们之前更改了设置,我们的设置将被willFinishLaunchingWithOptions方法覆盖。我在这个假设中是否正确并且可以自信地说设置将始终重置为willFinishLaunchingWithOptions中提供的默认值?
以下是示例代码:
import UIKit
import MapKit // for MKUserTrackingModeNone
@objc(BreadcrumbAppDelegate)
@UIApplicationMain
class BreadcrumbAppDelegate: NSObject, UIApplicationDelegate {
// The app delegate must implement the window @property
// from UIApplicationDelegate @protocol to use a main storyboard file.
var window: UIWindow?
func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
// it is important to registerDefaults as soon as possible,
// because it can change so much of how your app behaves
//
var defaultsDictionary: [String : AnyObject] = [:]
// by default we track the user location while in the background
defaultsDictionary[TrackLocationInBackgroundPrefsKey] = true as NSNumber
// by default we use the best accuracy setting (kCLLocationAccuracyBest)
defaultsDictionary[LocationTrackingAccuracyPrefsKey] = kCLLocationAccuracyBest as NSNumber
// by default we play a sound in the background to signify a location change
defaultsDictionary[PlaySoundOnLocationUpdatePrefsKey] = true as NSNumber
UserDefaults.standard.register(defaults: defaultsDictionary)
//print(defaultsDictionary)
//dump(defaultsDictionary)
return true
}
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
//..
return true
}
}
我想说我的假设是错误的,但是我没有在下次用户打开应用程序时如何跳过willFinishLaunchingWithOptions方法,因此没有重置设置。根据我读过的内容,我假设每次运行时环境都会自动触发willFinishLaunchingWithOptions方法。任何信息都非常感谢,因为我还在学习。
答案 0 :(得分:1)
您的假设不正确。如果没有为给定密钥保存显式值,UserDefaults register(defaults:)
只是从UserDefaults
获取值的一种方法。
最初,UserDefaults
为空。如果您尝试获取密钥的值,则会返回nil
。如果您明确存储了某个键的值,那么获取该键的值当然会为您提供该存储的值。
使用register(defaults:)
只会更改该行为的一部分。如果您尝试读取键的值并且当前没有值,则UserDefaults
将返回该键的任何已注册默认值(如果有),并返回该值。如果密钥没有注册默认值,那么您将获得nil
。
register(defaults:)
不会重置任何值。它不会替换任何值。在读取不存在的值时,它只作为内存中的后备。