Swift 5.1/Cocoa: 如何在 class 中注册一个非 self 的方法作为通知观察者?

Swift 5.1/Cocoa: How do I register a method in a class other than self as a notification observer?

我可以通过传入 self 并在同一 class 中引用方法来建立观察者回调:

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        DistributedNotificationCenter.default
                          .addObserver(
                            self,
                            selector: #selector(notificationReceived),
                            name: NSNotification.Name(rawValue: "Hello"),
                            object: nil)
    }

    @objc func notificationReceived() {
        print("I have received the notification!")
    }

    //...

在上述情况下,发布通知时会调用 notificationReceived。但是,如果我想注册属于另一个 class:

的回调,我不能这样做
class Another {
    @objc func notificationReceived() {
        print("I have received the notification!")
    }
}

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        let observer = Another()

        DistributedNotificationCenter.default
                          .addObserver(
                            observer,
                            selector: #selector(observer.notificationReceived),
                            name: NSNotification.Name(rawValue: "Hello"),
                            object: nil)
    }

为什么上面的方法不起作用?将属于self以外的对象的方法注册为回调,我需要做什么?

这与"another class"无关。它与对象生命周期有关。

您说的是 let observer = Another(),下一瞬间方法 didFinish 结束,您的 Another 实例 observer 消失在一阵烟雾中。所以通知中心没有人可以与之交谈。没有任何通知到达的机会;观察者在这发生之前就消失了。

(确实,以前你这样做会崩溃,因为你离开通知中心有一个"dangling pointer"。现在你不会崩溃了, 但什么也没有发生。)

self 不是这种情况,不是因为 self 是 "the same class",而是因为它是应用程序委托,它在应用程序的整个生命周期中都存在。