首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CGEventTap,CGEvent和NSEvent内存泄漏

CGEventTap,CGEvent和NSEvent内存泄漏
EN

Stack Overflow用户
提问于 2016-02-05 23:07:41
回答 1查看 504关注 0票数 0

一旦我将CGEvent转换为NSEvent (这是我需要的),我很难发布它。我是用CGEventTap来做这件事的。从文件中可以看出

返回:一个自动释放的NSEvent对象,等效于cgEvent 返回的对象保留CGEventRef对象(cgEvent),直到释放它( object对象),然后释放CGEventRef对象。如果没有Cocoa事件对应于CGEventRef对象,则此方法返回零。

因此,我编写了一些代码来转换为NSEvent,然后立即将NSEvent设置为零(作为测试)。即使在将其设置为零之后,无论是NSEvent还是带有它的CGEvent都不会被释放,而且每次鼠标移动时,我的内存都会增加。我不完全确定为什么。我觉得我错过了一些最基本的东西。

这是密码。

代码语言:javascript
复制
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!)
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-24 07:34:30

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

Swift应该会自动为您清除NSEvents,因此在自动释放池中设置e为0不应该是必要的。

以下是对我起作用的东西:

代码语言:javascript
复制
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)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35235072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档