//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中检索字典。
答案 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”];