【发布时间】:2019-03-12 05:53:42
【问题描述】:
在带有 Swift 4.2 的 Xcode 10.1 中,当我在 NSViewController 中为按键事件添加本地监视器时出现内存泄漏,它被实例化为最小版本(没有 nib 和 xib)。
override func loadView() {
self.view = NSView()
self.view.wantsLayer = true
}
override func viewDidLoad(){
super.viewDidLoad
NSEvent.addLocalMonitorForEvents(matching: .keyDown, handler: handler)
}
lazy var handler:(NSEvent)->NSEvent? = { [ weak self ,unowned picker = picker] event in
picker.keyDown(with: event)
return event
}
这个内存泄露信息不多:Memory leak
编辑
在 deinit 方法中调用 removeMonitor
deinit {
NSEvent.removeMonitor(self)
}
编辑 2
问题已解决:
override func loadView() {
self.view = NSView()
self.view.wantsLayer = true
}
var monitor:Any? // This is essential
override func viewDidLoad(){
super.viewDidLoad
monitor = NSEvent.addLocalMonitorForEvents(matching: .keyDown, handler: handler)
}
lazy var handler:(NSEvent)->NSEvent? = { [ weak self ,unowned picker = picker] event in
picker.keyDown(with: event)
return event
}
deinit {
NSEvent.removeMonitor(monitor)
}
【问题讨论】:
-
当视图控制器被关闭时你是否移除事件监视器?
-
将图片中的代码作为文本包含进来。
-
addLocalMonitorForEvents 注意 Monitor 块被调用用于匹配掩码的所有未来事件。您必须调用 removeMonitor: 来停止监视器。在垃圾收集下,在调用 removeMonitor: 之前不会收集监视器(以及 Block 引用的所有内容)。
-
我在 deinit 方法中使用 NSEvent.removeMonitor (self) 将其删除。这是正确的?。泄漏仍然存在