gpt4 book ai didi

Swift:addObserverForName 的 usingBlock 中可能存在 removeObserver 循环引用

转载 作者:行者123 更新时间:2023-11-30 13:20:44 24 4
gpt4 key购买 nike

我正在摆弄一个小型 Swift 应用程序。在其中,用户可以通过单击应用程序菜单中的“新建”来创建任意数量的 MainWindow 实例。

应用程序委托(delegate)保存一个类型为MainWindowController的数组。监 window 口中的 NSWindowWillCloseNotification,以便从 MainWindowController 数组中删除 Controller 。

现在的问题是,观察者的删除是否正确完成 - 我担心可能会有对观察者的循环引用,但我不知道如何测试:

class ApplicationDelegate: NSObject, NSApplicationDelegate {

private let notificationCenter = NSNotificationCenter.defaultCenter()
private var mainWindowControllers = [MainWindowController]()

func newWindow() {
let mainWindowController = MainWindowController()
let window = mainWindowController.window
var observer: AnyObject?
observer = notificationCenter.addObserverForName(NSWindowWillCloseNotification,
object: window,
queue: nil) { (_) in
// remove the controller from self.mainWindowControllers
self.mainWindowControllers = self.mainWindowControllers.filter() {
$0 !== mainWindowController
}
// remove the observer for this mainWindowController.window
self.notificationCenter.removeObserver(observer!)
}
mainWindowControllers.append(mainWindowController)
}

}

最佳答案

一般来说,您应该始终指定在 NSNotificationCenter 注册的 block 中 self 是无主的。这将防止该 block 对 self 产生强引用。您可以在闭包的参数列表前面使用捕获列表来执行此操作:

{ [unowned self] (_) in
// Block content
}

关于Swift:addObserverForName 的 usingBlock 中可能存在 removeObserver 循环引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37776568/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com