Ios Swift 3-用户默认值无理由自动清除

Ios Swift 3-用户默认值无理由自动清除,ios,swift3,userdefaults,Ios,Swift3,Userdefaults,我使用UserDefaults让用户登录,但有时用户会无缘无故地注销。当我调试这个案例时,我发现UserDefault为null 注意:除非用户点击注销按钮,否则我不会清除这些值 编辑: 下面是一些代码: 当用户登录时,我使用以下方法保存令牌: UserDefaults.standard.set("Bearer \(actualJson["access_token"].stringValue)", forKey: "access_token") UserDefaults.standard.set

我使用UserDefaults让用户登录,但有时用户会无缘无故地注销。当我调试这个案例时,我发现UserDefault为null

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

编辑:

下面是一些代码:

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

UserDefaults.standard.set("Bearer \(actualJson["access_token"].stringValue)", forKey: "access_token")
UserDefaults.standard.set("\(actualJson["refresh_token"].stringValue)", forKey: "refresh_token")
UserDefaults.standard.synchronize()
每次我从服务器令牌expire获得401错误时,我都会使用刷新令牌获得新的401错误:

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.stringforKey:refresh\u标记为null。虽然我确定我没有清除值

,但NSUserDefaults字符串也可能会被悬空指针超出范围。如果自动释放的对象被分配到应该保留的位置,并且NSUserDefaults字符串被分配到该位置,则当解除分配对象的所有者尝试释放它时,它将释放该字符串

如果看不到代码,就无能为力。只需检查您是否在appdelegate或其他文件中添加了清除用户默认值的代码。@DSDharma我更新了问题,可能是服务器的结果,刷新令牌时效果不好,如json[刷新令牌].stringValue为nil。在刷新令牌的情况下,会话到期时会得到什么json。验证了吗?不要使用UserDefaults.standard.synchronize。它不仅在iOS8之后就没用了,甚至还可能产生竞争条件、滞后等问题。