保存到 UserDefaults 时应用程序总是崩溃

Posted

技术标签:

【中文标题】保存到 UserDefaults 时应用程序总是崩溃【英文标题】:The app always crashes when saving to UserDefaults 【发布时间】:2018-10-06 12:40:59 【问题描述】:

我完全不知道出了什么问题:

extension UserDefaults 

    static let shared = UserDefaults(suiteName: SharedGroupName)!

    static func set(object: Any, forKey key: String) 

        shared.set(object, forKey: key)
        shared.synchronize()
    

【问题讨论】:

您正在强制解开可能返回 nil 的可失败初始化程序,因此当您引用它时会发生崩溃。你也不需要synchronize。什么是SharedGroupName @Paulw11 我刚刚更新了问题。 该共享组名称是否在您应用的权利中? 是的,它在权利中。 我想我解决了。我的问题。我为用户默认值添加了观察者,当控制器被取消初始化时没有删除它。这就是重点???? 【参考方案1】:

您应该尝试省略静态变量,只使用:

UserDefaults(suiteName: SharedGroupName)!.set(object, forKey: key)

这可能会有所作为。 此外,正如其中一个 cmets 所述,不需要“同步”。

【讨论】:

这里不需要强制解包。这是不好的做法,应该避免。【参考方案2】:

我重新创建了完全相同的源代码并且它没有崩溃,我相信崩溃是由您提供的示例文件之外的东西引起的。您能否添加更多可能将数据传递给扩展的代码?

【讨论】:

【参考方案3】:

只需将 shared 声明为可选。

static var shared: UserDefaults? = UserDefaults(suiteName: SharedGroupName)

【讨论】:

【参考方案4】:
extension UserDefaults 

    static let shared = UserDefaults(suiteName: SharedGroupName! as String)

    static func set(object: Any, forKey key: String) 

        shared?.set(object, forKey: key)
        // shared?.synchronize()  obsolete
    

    解开 SharedGroupName!作为字符串 使用可选的“?”与 shared 将运行您的代码正常

【讨论】:

评论了 .synchronize【参考方案5】: 您确定需要使用非默认 UserDefault 并使用特定的套件名称吗?

如果答案是肯定的并且原因是您正在使用小部件扩展,请确保主应用程序目标和小部件扩展目标都启用了应用程序组功能并使用相同并激活(必须设置复选标记) 应用组名称。

如果答案是否定的,请将 init 替换为 suiteName 并使用默认初始化程序。

强制解包 SharedGroupName!并且铸造对我来说看起来不合适。

static let shared = UserDefaults(suiteName: SharedGroupName! as String)

能否请您尝试直接传递 SharedGroupName 的字符串值?

【讨论】:

已经解决了,我将答案作为评论发布;)

以上是关于保存到 UserDefaults 时应用程序总是崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如何将两个 UITextView 中的数据保存到 UserDefaults

将值保存到 UserDefaults [重复]

Swift 5 将 AVAsset 保存到 UserDefaults

使用 struct id 将收藏夹保存到 UserDefaults

UserDefaults - 使用 Xcode Simulator 时保存不一致

什么是使用UserDefaults保存数据的适当事件?