Swift从NSNotification()实例化中返回nil,该实例化不应返回nil



这种情况发生在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?

分辨率:

当你解决最糟糕的bug时,你会觉得很傻,而我对这个bug感到特别傻。问题从来都不是NSNotification分配为零,LLDB在这方面对我撒谎,就像它在Swift中偶尔会做的那样。查看PO的通知,发现它被分配得很好。

我真正的问题是扩展及其控制器偶尔会从内存中卸载。当它被删除时,我没有删除我的通知处理程序,所以当它重新加载NSNotificationCenter时,它试图向卸载的观察者传递通知,所以崩溃了。关于在可以卸载的控制器/对象中使用NSNotifications,需要记住的一点是,在卸载时删除这些观察者。

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

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

现在比较theNotificationnil是合法的。

最新更新