gpt4 book ai didi

swift - 访问 refcon :UnsafeMutableRawPointer? 内部 CGEventTap 回调时崩溃

转载 作者:行者123 更新时间:2023-11-28 14:05:19 32 4
gpt4 key购买 nike

我有一个用于 CGEventTap 的 myCGEventCallback 函数,它接受参数“refcon:UnsafeMutableRawPointer?”。

我使用

将我的主 ViewController 作为指向回调的指针传递
let pointer = UnsafeMutableRawPointer(Unmanaged.passRetained(self).toOpaque())

然后在回调中,我使用

访问 ViewController
let sender:ViewController = Unmanaged<T>.fromOpaque(refcon!).takeRetainedValue()

当事件发生时,回调工作正常。但是,它只能工作 4 次。当同一个事件第五次发生时,我的应用程序崩溃了,调试控制台只显示“LLDB”。

当我尝试访问发件人时,它似乎崩溃了。 “sender.someFunction()”。它在函数开始运行之前崩溃,所以我假设它在访问发件人时遇到问题。

这是因为内存管理不善吗?也许我需要释放指针?如果是这样,我将如何以及在何处执行此操作?

谢谢!

最佳答案

passRetained(self) 增加了 self 的保留计数(这是你的查看 Controller 实例)一个。每次调用 takeRetainedValue() 都会减少保留计数加一。这些调用必须适当平衡,否则该对象可能会过早销毁。

在你的例子中,指针被创建一次,但在一个回调函数,你应该使用“unretained”转换回调:

let sender = Unmanaged<ViewController>.fromOpaque(refcon!).takeUnretainedValue()

这样就不会转移所有权。

如何创建指针有两种模式:

  • 如果保证回调只在生命周期内有效 View Controller 然后你可以创建指针而不保留实例:

    let pointer = UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque())
  • 否则,如果 View Controller 实例应该保持事件状态当回调处于事件状态时,在创建指针时保留它

    let pointer = UnsafeMutableRawPointer(Unmanaged.passRetained(self).toOpaque())

    并最终在回调不再有效时释放它:

    Unmanaged<ViewController>.fromOpaque(pointer).release()

关于swift - 访问 refcon :UnsafeMutableRawPointer? 内部 CGEventTap 回调时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53065186/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com