访问 refcon:UnsafeMutableRawPointer 时崩溃?内部 CGEventTap 回调
Crash When Accessing refcon:UnsafeMutableRawPointer? Inside CGEventTap Callback
我有一个用于 CGEventTap 的 myCGEventCallback 函数,它采用参数 "refcon:UnsafeMutableRawPointer?"。
我使用
将我的 main ViewController 作为指向回调的指针传递
let pointer = UnsafeMutableRawPointer(Unmanaged.passRetained(self).toOpaque())
然后在回调中,我使用
访问 ViewController
let sender:ViewController = Unmanaged<T>.fromOpaque(refcon!).takeRetainedValue()
当事件发生时,回调工作正常。但是,它只能工作 4 次。当同一个事件第五次发生时,我的应用程序崩溃了,调试控制台只显示 "LLDB".
当我尝试访问发件人时它似乎崩溃了。 "sender.someFunction()"。它在函数到达 运行 之前崩溃,所以我假设它在访问发件人时遇到问题。
这是因为内存管理不善吗?也许我需要释放指针?如果是这样,我将如何以及在哪里做?
谢谢!
passRetained(self)
增加了 self
的保留计数(这是你的
查看控制器实例)一个。每次调用 takeRetainedValue()
都会减少
保留计数加一。这些调用必须适当平衡,否则
该对象可能被过早销毁。
在你的例子中,指针被创建一次,但在
一个回调函数,你应该使用“unretained”转换
回调:
let sender = Unmanaged<ViewController>.fromOpaque(refcon!).takeUnretainedValue()
这样就不会转移所有权。
如何创建指针有两种模式:
如果保证回调只在生命周期内有效
视图控制器然后你可以创建指针而不保留
实例:
let pointer = UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque())
否则,如果视图控制器实例应该保持活动状态
当回调处于活动状态时,在创建指针时保留它
let pointer = UnsafeMutableRawPointer(Unmanaged.passRetained(self).toOpaque())
并最终在回调不再有效时释放它:
Unmanaged<ViewController>.fromOpaque(pointer).release()
我有一个用于 CGEventTap 的 myCGEventCallback 函数,它采用参数 "refcon:UnsafeMutableRawPointer?"。
我使用
将我的 main ViewController 作为指向回调的指针传递let pointer = UnsafeMutableRawPointer(Unmanaged.passRetained(self).toOpaque())
然后在回调中,我使用
访问 ViewControllerlet sender:ViewController = Unmanaged<T>.fromOpaque(refcon!).takeRetainedValue()
当事件发生时,回调工作正常。但是,它只能工作 4 次。当同一个事件第五次发生时,我的应用程序崩溃了,调试控制台只显示 "LLDB".
当我尝试访问发件人时它似乎崩溃了。 "sender.someFunction()"。它在函数到达 运行 之前崩溃,所以我假设它在访问发件人时遇到问题。
这是因为内存管理不善吗?也许我需要释放指针?如果是这样,我将如何以及在哪里做?
谢谢!
passRetained(self)
增加了 self
的保留计数(这是你的
查看控制器实例)一个。每次调用 takeRetainedValue()
都会减少
保留计数加一。这些调用必须适当平衡,否则
该对象可能被过早销毁。
在你的例子中,指针被创建一次,但在 一个回调函数,你应该使用“unretained”转换 回调:
let sender = Unmanaged<ViewController>.fromOpaque(refcon!).takeUnretainedValue()
这样就不会转移所有权。
如何创建指针有两种模式:
如果保证回调只在生命周期内有效 视图控制器然后你可以创建指针而不保留 实例:
let pointer = UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque())
否则,如果视图控制器实例应该保持活动状态 当回调处于活动状态时,在创建指针时保留它
let pointer = UnsafeMutableRawPointer(Unmanaged.passRetained(self).toOpaque())
并最终在回调不再有效时释放它:
Unmanaged<ViewController>.fromOpaque(pointer).release()