gpt4 book ai didi

swift - CGEventTap、CGEvent 和 NSEvent 内存泄漏

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

一旦我将 CGEvent 转换为 NSEvent (我需要),我就很难释放它。我正在使用 CGEventTap 来执行此操作。从文档中可以看出

Returns: An autoreleased NSEvent object that is equivalent to cgEvent

The returned object retains the CGEventRef object (cgEvent) until it (the Objective-C object) is freed—it then releases the CGEventRef object. If no Cocoa event corresponds to the CGEventRef object, this method returns nil.

所以我编写了一些代码来转换为 NSEvent,然后立即将 NSEvent 设置为 nil(作为测试)。即使将其设置为 nil 后,NSEvent 或带有它的 CGEvent 都不会被释放,并且我的内存会随着鼠标的每次移动而不断增加。我不太清楚为什么。我觉得我在这里错过了一些基本的东西。

这是代码。

func eventCallBack(proxy: CGEventTapProxy, type: CGEventType, var event: CGEvent, refcon: UnsafeMutablePointer<Void>) -> Unmanaged<CGEvent>? {

//this line is what causes the memory leak
if var e: NSEvent? = NSEvent(CGEvent: event) {
e = nil //according to docs, this should decrease reference count to event
}

return Unmanaged.passUnretained(event!)
}

最佳答案

正如 @Willeke 评论的那样,autoreleasepool 为我修复了内存泄漏。

Swift 应该会自动为你清理 NSEvents,因此在 autoreleasepool 中不需要将 e 设置为 nil。

这对我有用:

func eventCallBack(proxy: CGEventTapProxy, type: CGEventType, var event: CGEvent, refcon: UnsafeMutablePointer<Void>) -> Unmanaged<CGEvent>? {

autoreleasepool{
var e: NSEvent? = NSEvent(CGEvent: event)
// code using e
}

return Unmanaged.passUnretained(event)
}

关于swift - CGEventTap、CGEvent 和 NSEvent 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35235072/

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