【发布时间】:2020-04-15 18:40:44
【问题描述】:
所以我尝试使用 CoreAudio 方法AUGraphAddRenderNotify(...),但我需要在通知块中创建此通知的类的引用。因为这是一个 C 函数,所以我不能简单地添加一个 [weak self] in 闭包捕获。查看Documentation,该方法的最后一个参数允许是UnsafeMutableRawPointer,它将在块执行期间作为第一个参数传入。在this suggestion 之后,这是我拥有的代码:
let selfPointer = Unmanaged.passUnretained(self).toOpaque()
AUGraphAddRenderNotify(graph, { (audioPlayerPointer, _, _, _, _, _) -> OSStatus in
let audioPlayer = Unmanaged<AudioPlayer>.fromOpaque(audioPlayerPointer).takeUnretainedValue()
...
return noErr
}, selfPointer)
这是我的问题:
我需要弄清楚如何安全地获取该指针背后的值(占零)。更具体地说,我想安全地访问 audioPlayer 并确保在我使用它时它还没有被释放。目前,一切正常,直到 audioPlayer 被释放,然后我的应用程序崩溃。我知道我可以使用AUGraphRemoveRenderNotify(...) 在对象被释放之前停止通知,但不幸的是这种方法不是我想要的。如何检查指针指向的对象是否已经被释放?
提前致谢!
【问题讨论】:
-
在播放器的 deinit 方法中调用 AUGraphRemoveRenderNotify 是一个干净的解决方案,你为什么不喜欢呢? – 另一种方法是创建一个 retained 指针。这可以防止播放器在您明确释放之前被释放。
-
我不在 deinit 方法中这样做的原因是因为块中的一些代码在主线程上运行,并且可能会在 AudioPlayer 已经被释放后尝试访问它
-
我不完全确定我是否理解您的意思。一旦通知程序被删除,回调块中的代码就不能被调用。如果你在回调 inside 调度异步代码,那么你可以在那里创建一个弱引用。 – 也许更多一些代码来演示这个问题会有所帮助。
标签: ios swift pointers core-audio raw-pointer