这种情况发生在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)
现在比较theNotification
和nil
是合法的。