swift - 访问 refcon:UnsafeMutableRawPointer 时崩溃?CGEventTap 回调内部
问题描述
我有一个用于 CGEventTap 的 myCGEventCallback 函数,它接受参数“refcon:UnsafeMutableRawPointer?”。
我将我的主 ViewController 作为指向回调的指针传递给使用
let pointer = UnsafeMutableRawPointer(Unmanaged.passRetained(self).toOpaque())
然后在回调中,我使用 ViewController 访问
let sender:ViewController = Unmanaged<T>.fromOpaque(refcon!).takeRetainedValue()
当事件发生时,回调工作正常。但是,它只能工作 4 次。当同一事件第五次发生时,我的应用程序崩溃,调试控制台只显示“LLDB”。
当我尝试访问发件人时,它似乎崩溃了。“发件人.someFunction()”。它在函数运行之前崩溃,所以我认为它在访问发件人时有问题。
这是因为内存管理不善吗?也许我需要释放指针?如果是这样,我将如何以及在哪里这样做?
谢谢!
解决方案
passRetained(self)
self
将(这是您的视图控制器实例)的保留计数增加一。每次调用都会takeRetainedValue()
将保留计数减一。这些调用必须适当平衡,否则对象可能会过早销毁。
在您的情况下,指针被创建一次,但在回调函数中使用了多次,您应该在回调中使用“未保留”转换:
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()
推荐阅读
- swift - NavigationView + GeometryReader views return incorrect size
- python - 保持python脚本运行(如果退出则重新启动)
- python - 如何使用 Python 在 Ubuntu 中将 HTML 页面转换为 Pdf?
- html - 触发按钮 onClick 后发生 HTML 输入验证
- javascript - 我正在尝试让用户使用 2 个按钮选择将在 iframe 标记中显示的站点
- python - 创建重复 N 次的可变项列表
- javascript - JS 如何在终端的数组中输出数组?
- javascript - HTML / Javascript 显示来自用户输入复选框的图像
- python - 正则表达式或替换方法最好清理列表吗?重新熊猫环境
- r - 如何通过 R 下币安订单