【问题标题】:iOS WatchKit - Adding Key Value Observer to NSUserDefaults crashesiOS WatchKit - 将键值观察器添加到 NSUserDefaults 崩溃
【发布时间】:2015-04-08 22:58:04
【问题描述】:

我正在尝试添加将数据从 iPhone 发送到 Watch 的功能。 我已经设置了应用程序组并且一切运行顺利,但是当我尝试在 Watch Extension 文件中向 NSUserDefaults 添加观察者时,应用程序总是在启动时崩溃。 (是的,我已经验证了应用组名称是正确的,并在所有目标功能中进行了检查,并且所有配置文件在启用应用组的情况下都是最新的)

代码:

override func willActivate() 
{
    super.willActivate()

    NSUserDefaults(suiteName: "my.suite.name")?.addObserver(self, forKeyPath: "phoneSaysHello", options: NSKeyValueObservingOptions.New, context: nil)
}

override func didDeactivate() 
{
    super.didDeactivate()

    // Remove listener for commands sent from phone
    NSUserDefaults(suiteName: "my.suite.name")?.removeObserver(self, forKeyPath: "phoneSaysHello", context: nil)
}

错误:

*** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“一个实例 NSUserDefaults 类的 0x7f99534559b0 被释放,而键值 观察员仍然在它那里注册。当前观察信息: ( 上下文:0x0,属性:0x7f9953609200>)'

【问题讨论】:

    标签: ios nsuserdefaults key-value-observing watchkit


    【解决方案1】:

    您的NSUserDefaults 似乎已超出范围。将userDefaults 转换为实例变量应该会停止抛出异常。

    【讨论】:

    • 这是使用“if let”时的问题。我更新为使用 NSUserDefaults 引用本身,但仍然出现相同的崩溃/错误。查看更新的代码。
    • 尝试将默认值保留为类的实例变量
    • 好的更改为实例变量。不会崩溃,但是当手机更新 NSUserDefaults(suiteName: "my.suite.name") 时,观察者永远不会被击中。使用实例变量是否意味着手表无法识别手机何时更新它自己的应用组 NSUserDefaults 的实例变量?
    • 这就是我所担心的:观察默认值并不是在您的应用程序和手表扩展程序之间进行通信的有效方式。为此,请查看 stackoverflow.com/q/27144114/22147github.com/mutualmobile/MMWormhole。但是,请看好的一面:您的崩溃已修复。
    猜你喜欢
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 2017-04-01
    • 1970-01-01
    相关资源
    最近更新 更多