【发布时间】:2018-10-30 13:17:54
【问题描述】:
我有一个用于 CGEventTap 的 myCGEventCallback 函数,它接受参数“refcon:UnsafeMutableRawPointer?”。
我将主 ViewController 作为指向回调的指针传递给使用
let pointer = UnsafeMutableRawPointer(Unmanaged.passRetained(self).toOpaque())
然后在回调中,我使用
访问 ViewControllerlet sender:ViewController = Unmanaged<T>.fromOpaque(refcon!).takeRetainedValue()
当事件发生时,回调工作正常。但是,它只能工作 4 次。当同一事件第五次发生时,我的应用程序崩溃,调试控制台只显示“LLDB”。
当我尝试访问发件人时,它似乎崩溃了。 “发件人.someFunction()”。它在函数运行之前崩溃了,所以我认为它在访问发送者时遇到了问题。
这是因为内存管理不善吗?也许我需要释放指针?如果是这样,我将如何以及在哪里这样做?
谢谢!
【问题讨论】:
-
takeRetainedValue()执行对象的释放,因此您不应在仅保留一次的对象上多次调用它。你可能想要做的是在你的回调中使用takeUnretainedValue(),然后当你知道回调不能再被调用时使用.release()——例如见stackoverflow.com/a/44215903/2976878
标签: swift cgeventtap