Swift 3 - UserDefaults 无缘无故自动清除

Posted

技术标签:

【中文标题】Swift 3 - UserDefaults 无缘无故自动清除【英文标题】:Swift 3 - UserDefaults Cleared Automatically With No Reason 【发布时间】:2017-07-18 05:46:57 【问题描述】:

我使用 UserDefaults 让用户保持登录状态,但有时用户会无缘无故地退出。当我调试这个案例时,我发现 UserDefault 为空!

注意:除非用户点击注销按钮,否则我不会清除这些值。

编辑:

这是一些代码:

当用户登录时,我使用以下方式保存令牌:

UserDefaults.standard.set("Bearer \(actualJson["access_token"].stringValue)", forKey: "access_token")
UserDefaults.standard.set("\(actualJson["refresh_token"].stringValue)", forKey: "refresh_token")
UserDefaults.standard.synchronize()

每次我从服务器收到 401 错误(令牌过期)时,我都会使用 refresh_token 获得新的错误:

AccountService.refreshToken(refreshToken: UserDefaults.standard.object(forKey: "refresh_token") != nil ? UserDefaults.standard.string(forKey: "refresh_token")! : "", callback:  (json) in

    // set user defaults
    UserDefaults.standard.set("Bearer \(json["access_token"].stringValue)", forKey: "access_token")
    UserDefaults.standard.set("\(json["refresh_token"].stringValue)", forKey: "refresh_token")
    UserDefaults.standard.synchronize()  
)

在 AppDelegate 的 didFinishLaunchingWithOptions 方法中:

if UserDefaults.standard.object(forKey: "access_token") != nil && UserDefaults.standard.string(forKey: "refresh_token") != "" 
            // go to home

在前面的代码中,UserDefaults.standard.string(forKey: "refresh_token") 为空。虽然我确定我没有清除值

【问题讨论】:

看不到代码什么都做不了。只需检查您是否在 appdelegate 或其他文件中添加了清除用户默认值的代码。 @DSDharma 我更新了问题 刷新令牌时可能是服务器的结果不好,比如json["refresh_token"].stringValue 为零。 在刷新令牌的会话过期情况下,您会得到什么 json。你验证了吗? 不要使用UserDefaults.standard.synchronize()。它不仅自 ios8 以来就毫无用处,甚至会产生问题(竞争条件、滞后等)。 【参考方案1】:

NSUserDefaults 字符串也可能被悬空指针过度释放。如果一个自动释放的对象被分配到一个应该被保留的地方,并且 NSUserDefaults 字符串被分配在它的位置,当被释放对象的“所有者”试图释放它时,它将释放这个字符串。

【讨论】:

以上是关于Swift 3 - UserDefaults 无缘无故自动清除的主要内容,如果未能解决你的问题,请参考以下文章

userdefaults 使用问题 swift 3

Swift 3 UserDefaults 设置 NSMutableArray

如何将完整的 UserDefaults 列表放入 tableview - Swift 3

如何使用 userDefaults 保存打印数组(swift 3)

Swift 3.0:在 TableView 的 UserDefaults 中存储数组

在 Swift 3 中删除 UserDefaults 的单个键值