我有一个用于myCGEventCallback的CGEventTap函数,它的参数是"refcon:UnsafeMutableRawPointer?“。
我将主ViewController作为回调的指针传递给
let pointer = UnsafeMutableRawPointer(Unmanaged.passRetained(self).toOpaque())然后在回调中,我使用
let sender:ViewController = Unmanaged<T>.fromOpaque(refcon!).takeRetainedValue()当事件发生时,回调可以正常工作。然而,它只工作4次。当第五次发生相同的事件时,我的应用程序就会崩溃,调试控制台只会说"LLDB“。
当我试图访问发件人时,它似乎崩溃了。Sender.someFunction()它在函数运行之前就崩溃了,所以我假设它在访问发件人时遇到了问题。
这是因为内存管理不善吗?也许我需要换掉指针?如果是这样的话,我将如何和在哪里这样做?
谢谢!
发布于 2018-10-30 13:25:15
passRetained(self)将self (即视图控制器实例)的保留计数增加一个。每次对takeRetainedValue()的调用都会减少一个保留计数。这些调用必须进行适当的平衡,否则对象可能会被过早销毁。
在您的示例中,指针只创建一次,但在回调函数中使用了多次,您应该在回调中使用“未保留”转换:
let sender = Unmanaged<ViewController>.fromOpaque(refcon!).takeUnretainedValue()这样就不会转移所有权。
如何创建指针有两种模式:
https://stackoverflow.com/questions/53065186
复制相似问题