-[NSConcreteNotification count]:无法识别的选择器发送到实例 0x2816dd380

xap*_*hod 2 ios

我花了一个小时才解决这个 iOS 崩溃问题,发布解决方案以防有帮助。除了崩溃count之后,您可能会获得不同的值。NSConcreteNotification

我在访问 array.count 时崩溃了,这就是我的情况下它是 count 的原因:

    @objc fileprivate func loadParts(constraints: [NSLayoutConstraint]? = nil) {
        assert(Thread.current.isMainThread)
        var constraints = constraints ?? [NSLayoutConstraint]()
        ...
        let cCount = constraints.count
Run Code Online (Sandbox Code Playgroud)

我一生都无法看到它如何在constraints.count上崩溃,因为数组保证存在。

xap*_*hod 8

我将此函数连接到一个通知,如下所示:

NotificationCenter.default.addObserver(self, selector: #selector(self.loadParts), name: UIDevice.batteryStateDidChangeNotification, object: nil)

Run Code Online (Sandbox Code Playgroud)

如果您查看 addObserver 的文档,它会说该函数必须只有一个参数,即“通知”。发生的情况是,我的函数是通过通知调用的,但我的代码希望它是一个数组。

解决方法是创建一个新函数,简单地调用我想要的函数 (loadParts),并让通知命中该函数:

    NotificationCenter.default.addObserver(self, selector: #selector(self.loadPartsNotification(_:)), name: UIDevice.batteryStateDidChangeNotification, object: nil)

    ...

    @objc fileprivate func loadPartsNotification(_ notification: Notification) {
        self.loadParts()
    }
    
    fileprivate func loadParts(constraints: [NSLayoutConstraint]? = nil) {
    ...

Run Code Online (Sandbox Code Playgroud)