在NSUserDefaults中存储字典导致EXC_BAD_ACCESS

时间:2015-02-05 15:42:36

标签: xcode swift dictionary nsuserdefaults

//Declarations
var scoreIncrement:Int = 0
var team = ""
var userScore = Dictionary<String,Int>()

//Set Values
team = "USA"
userScore[team] = 0

//Store in NSUserDefaults
NSUserDefaults.standardUserDefaults().setObject(userScore, forKey: "userScore")
NSUserDefaults.standardUserDefaults().synchronize()

//Increment Score
scoreIncrement = 1
userScore[team]! += scoreIncrement

上面的代码给出了&#39; EXC_BAD_ACCESS(代码= EXC_I386_GPFLT)&#39;代码的最后一行出错。但是,如果我注释掉行:

NSUserDefaults.standardUserDefaults().setObject(userScore, forKey: "userScore")

错误消失了。不知道为什么会发生这种情况,我甚至还没有从NSUserDefaults中检索字典。

3 个答案:

答案 0 :(得分:0)

通过以下方式将NSUserDefaults中的字典检索出来后解决了问题:

var userScoreTemp : AnyObject? = NSUserDefaults.standardUserDefaults().objectForKey("userScore")
    if userScoreTemp != nil {
        userScore = userScoreTemp! as Dictionary
    }

答案 1 :(得分:0)

我也有这个问题。事实证明这是一个KVO问题。您可能已取消分配观察此值的对象,因此正在发送消息而未按预期接收消息。

我的解决方案是从关联的释放对象中删除观察者。永远记住,addObserver:forKeyPath:options:context:是否与关联的removeObserver:forKeyPath:电话相匹配。

答案 2 :(得分:0)

我遇到了同样的问题。

我在NSUserDefaults中存储了String值,如:

[[NSUserDefaults standardUserDefaults] stValue:@"Rahul" forKey:@"Name"];

在一段时间后,它在同一点崩溃,写出相同的值。原因是在此期间之后我在NSUserdefaults中注册了更改,代码如下:

[[NSNotificationCenter defaultCenter] addObserver:self selector: @selector(valueChange) name:NSUserDefaultsDidChangeNotification object:nil];

这是在初始化时在导入器中完成的。在导入器被解除分配后,对用户默认值的新写入触发了一个已经消失的对象的观察者。崩溃。

解决方案当然是要删除观察者。

NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];     [默认为removeObserver:self forKeyPath:@“Name”];