创建弱的UnsafeMutableRawPointer

问题描述 投票:0回答:1

所以我试图使用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(...)在对象被释放之前停止通知,但是不幸的是,这种方法不是我想要的。如何检查指针所指向的对象是否已被释放?

提前感谢!

ios swift pointers core-audio raw-pointer
1个回答
0
投票

有趣的是,弱引用实际上并不指向它们建模的目标对象。它们指向边表,其寿命与目标对象不同。

  • 在对对象进行第一个弱引用时分配了一个边表条目。
  • 每个弱引用的创建都会增加边表条目的引用计数,而每次弱引用的破坏都会使其减少。
  • 一旦释放了目标对象,边表条目将保留在原位。这样,所有弱引用都不会成为悬空指针。
  • [最终释放目标对象之后,所有尝试访问弱引用(已死)的尝试都会导致弱引用被nil删除(这是您作为用户观察到的),但是减少边表条目
  • 因此,每个弱引用要么需要销毁(例如,超出范围),要么尝试在边表条目到期之前进行访问。

由于这些边表条目未暴露给“用户区” Swift代码,因此您无法为它们创建原始指针,因此,您无法真正以这种方式处理弱引用。

尽管我还没有尝试过,但是我对您可以做什么有一些想法。

  1. 您可以利用UnsafeMutableRawPointer指针传递Weak<T>包装器,例如:

    struct Weak<T: AnyObject {
        wear var object: T?
    }
    
  2. 或其他某种机制,例如传递闭包(弱捕获对象)

© www.soinside.com 2019 - 2024. All rights reserved.