所以我试图使用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(...)
在对象被释放之前停止通知,但是不幸的是,这种方法不是我想要的。如何检查指针所指向的对象是否已被释放?
提前感谢!
有趣的是,弱引用实际上并不指向它们建模的目标对象。它们指向边表,其寿命与目标对象不同。
nil
删除(这是您作为用户观察到的),但是减少边表条目由于这些边表条目未暴露给“用户区” Swift代码,因此您无法为它们创建原始指针,因此,您无法真正以这种方式处理弱引用。
尽管我还没有尝试过,但是我对您可以做什么有一些想法。
您可以利用UnsafeMutableRawPointer
指针传递Weak<T>
包装器,例如:
struct Weak<T: AnyObject {
wear var object: T?
}
或其他某种机制,例如传递闭包(弱捕获对象)