Swift从NSNotification()实例化中返回nil,该实例化永远不会返回nil

时间:2015-02-12 01:14:53

标签: ios swift

这是在Swift 1.1中出现的,在下面的代码中,“theNotification”偶尔会返回为nil,这会导致NSNotificationCenter.postNotification()崩溃。我无法弄清楚为什么,因为它很少见,可能是因为代码是在iOS8键盘扩展中,但我不知道为什么这很重要。

class func sendNotificationValue(name : String, value: Int) {
    let notificationQ = NSNotificationCenter.defaultCenter()
    let userDict = ["value": value]
    let theNotification = NSNotification(name: name, object: nil, userInfo: userDict)
    notificationQ.postNotification(theNotification)
}

但是我的另一个问题是因为Notification不是可选的,我无法检查它是否为nil,我得到“NSObject不符合协议'NilLiteralConvertible”,所以我无法防御程序以防止崩溃。

显然,最好的解决方案是弄清楚为什么它首先返回nil,但我试图在这种情况下至少不会崩溃。有关为什么会返回nil的任何建议,或者我如何在这里检查notification为nil?

决议:

最糟糕的错误会让你在解决问题时感到愚蠢,我觉得这个问题更加愚蠢。问题从未发生过nN NSNotification分配,LLDB对我说谎,因为它偶尔会在Swift中做。看着PO的通知显示它被分配了罚款。

我真正的问题是偶尔可以从内存中卸载扩展及其控制器。我没有删除我的通知处理程序,所以当它重新加载时,NSNotificationCenter试图向卸载的观察者发送通知,因此崩溃。要记住在可以卸载的控制器/对象中使用NSNotifications时需要注意的事项,请删除那些观察者。

1 个答案:

答案 0 :(得分:2)

创建时,只需键入theNotification作为可选项:

let theNotification: NSNotification? = 
    NSNotification(name: name, object: nil, userInfo: userDict)

现在将theNotificationnil进行比较是合法的。