一旦我将CGEvent转换为NSEvent (这是我需要的),我很难发布它。我是用CGEventTap来做这件事的。从文件中可以看出
返回:一个自动释放的NSEvent对象,等效于cgEvent 返回的对象保留CGEventRef对象(cgEvent),直到释放它( object对象),然后释放CGEventRef对象。如果没有Cocoa事件对应于CGEventRef对象,则此方法返回零。
因此,我编写了一些代码来转换为NSEvent,然后立即将NSEvent设置为零(作为测试)。即使在将其设置为零之后,无论是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!)
}发布于 2016-11-24 07:34:30
正如@Willeke评论的那样,一个autoreleasepool为我修复了内存泄漏。
Swift应该会自动为您清除NSEvents,因此在自动释放池中设置e为0不应该是必要的。
以下是对我起作用的东西:
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)
}https://stackoverflow.com/questions/35235072
复制相似问题