在以下代码中,每次打开应用程序时是否重置NSUserDefaults设置?

时间:2017-02-05 22:08:14

标签: ios swift nsuserdefaults

我正在慢慢掌握对象范围以及如何在应用程序中传递它们。 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方法。任何信息都非常感谢,因为我还在学习。

1 个答案:

答案 0 :(得分:1)

您的假设不正确。如果没有为给定密钥保存显式值,UserDefaults register(defaults:)只是从UserDefaults获取值的一种方法。

最初,UserDefaults为空。如果您尝试获取密钥的值,则会返回nil。如果您明确存储了某个键的值,那么获取该键的值当然会为您提供该存储的值。

使用register(defaults:)只会更改该行为的一部分。如果您尝试读取键的值并且当前没有值,则UserDefaults将返回该键的任何已注册默认值(如果有),并返回该值。如果密钥没有注册默认值,那么您将获得nil

register(defaults:)不会重置任何值。它不会替换任何值。在读取不存在的值时,它只作为内存中的后备。