一旦我将它转换为NSEvent(我需要),我很难释放CGEvent。我正在使用CGEventTap这样做。 从文件中说明
返回:一个自动释放的NSEvent对象,它等同于cgEvent
返回的对象保留CGEventRef对象(cgEvent),直到释放它(Objective-C对象)为止,然后释放CGEventRef对象。如果没有Cocoa事件对应于CGEventRef对象,则此方法返回nil。
所以我编写了一些代码转换为NSEvent,然后立即将NSEvent设置为nil(作为测试)。即使将它设置为nil之后,NSEvent或带有它的CGEvent也不会被释放,并且我的记忆会随着每次鼠标移动而不断上升。我不完全确定为什么。我觉得我在这里缺少一些基本的东西。
这是代码。
NSString *str = sfs(@selector(crazyObject));
答案 0 :(得分:0)
正如@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)
}