首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问折射时崩溃:不安全突变refcon?内部CGEventTap回调

访问折射时崩溃:不安全突变refcon?内部CGEventTap回调
EN

Stack Overflow用户
提问于 2018-10-30 13:17:54
回答 1查看 299关注 0票数 0

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

我将主ViewController作为回调的指针传递给

代码语言:javascript
复制
let pointer = UnsafeMutableRawPointer(Unmanaged.passRetained(self).toOpaque())

然后在回调中,我使用

代码语言:javascript
复制
let sender:ViewController = Unmanaged<T>.fromOpaque(refcon!).takeRetainedValue()

当事件发生时,回调可以正常工作。然而,它只工作4次。当第五次发生相同的事件时,我的应用程序就会崩溃,调试控制台只会说"LLDB“。

当我试图访问发件人时,它似乎崩溃了。Sender.someFunction()它在函数运行之前就崩溃了,所以我假设它在访问发件人时遇到了问题。

这是因为内存管理不善吗?也许我需要换掉指针?如果是这样的话,我将如何和在哪里这样做?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-30 13:25:15

passRetained(self)self (即视图控制器实例)的保留计数增加一个。每次对takeRetainedValue()的调用都会减少一个保留计数。这些调用必须进行适当的平衡,否则对象可能会被过早销毁。

在您的示例中,指针只创建一次,但在回调函数中使用了多次,您应该在回调中使用“未保留”转换:

代码语言:javascript
复制
let sender = Unmanaged<ViewController>.fromOpaque(refcon!).takeUnretainedValue()

这样就不会转移所有权。

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

  • 如果只在视图控制器的生存期内保证回调是活动的,那么您可以创建指针而不保留实例: 让指针= UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque())
  • 否则,如果在回调处于活动状态时视图控制器实例应保持活动状态,则在创建指针时保留它。 让指针= UnsafeMutableRawPointer(Unmanaged.passRetained(self).toOpaque()) 并在回调不再激活时,最终释放它: Unmanaged.fromOpaque(指针).release()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53065186

复制
相关文章

相似问题

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