Ios 创建弱的unsafemeutablerawpointer

Ios 创建弱的unsafemeutablerawpointer,ios,swift,pointers,core-audio,raw-pointer,Ios,Swift,Pointers,Core Audio,Raw Pointer,因此,我试图使用CoreAudio方法AUGraphAddRenderNotify(…),但我需要一个对在通知块中创建此通知的类的引用。因为这是一个C函数,所以我不能简单地在闭包捕获中添加一个[weak self]。查看,此方法的最后一个参数可以是unsafemeutablerawpointer,它将在块执行期间作为第一个参数传入。以下是我的代码: let selfPointer = Unmanaged.passUnretained(self).toOpaque() AUGraphAddRend

因此,我试图使用CoreAudio方法
AUGraphAddRenderNotify(…)
,但我需要一个对在通知块中创建此通知的类的引用。因为这是一个C函数,所以我不能简单地在闭包捕获中添加一个
[weak self]。查看,此方法的最后一个参数可以是
unsafemeutablerawpointer
,它将在块执行期间作为第一个参数传入。以下是我的代码:

let selfPointer = Unmanaged.passUnretained(self).toOpaque()
AUGraphAddRenderNotify(graph, { (audioPlayerPointer, _, _, _, _, _) -> OSStatus in
    let audioPlayer = Unmanaged<AudioPlayer>.fromOpaque(audioPlayerPointer).takeUnretainedValue()
    ...

    return noErr
}, selfPointer)
let selfPointer=Unmanaged.passUnretained(self.toOpaque())
AUGraphAddRenderNotify(图形,{(audioPlayerPointer,,,,,,,,-)中的OSStatus
让audioPlayer=Unmanaged.from不透明(audioPlayerPointer).takeUnretainedValue()
...
返回noErr
},自指针)
这是我的问题: 我需要弄清楚如何安全地获得这个指针后面的值(考虑到nil)。更具体地说,我想安全地访问audioPlayer,并确保在我使用它时它还没有被释放。目前,一切正常,直到audioPlayer被释放,然后我的应用程序崩溃。我知道我可以使用
augraphRemoveEnderNotify(…)
在对象解除分配之前停止通知,但不幸的是,这种方法不是我想要的。如何检查指针指向的对象是否已解除分配

提前谢谢

弱引用并不是这样的 有趣的是,弱引用实际上并不指向它们所建模的目标对象。它们指向副表,其生存期与目标对象不同

  • 当对对象进行第一次弱引用时,会分配一个边表条目
  • 创建每个弱引用都会增加边表项的ref计数,而每次销毁弱引用都会减少它
  • 一旦目标对象被解除分配,边表条目将保持不变。这样,所有弱引用就不会变成悬空指针
  • 最终解除分配目标对象后,所有访问弱引用的尝试(现在已停止)都会导致弱引用被
    nil
    -ed输出(这是您作为用户观察到的),但也会减少边表条目
  • 因此,每个弱引用要么需要销毁(例如超出范围),要么在边表条目过期之前尝试访问
由于这些边表条目不暴露于“user land”Swift代码中,因此您无法生成指向它们的原始指针,因此您无法以这种方式处理弱引用

交替思想 我对你能做些什么有一些想法,尽管我还没有尝试过

  • 您可以利用
    unsafemeutablerawpointer
    指针来传递
    包装,如:

    struct Weak<T: AnyObject> {
        wear var object: T?
    }
    
    struct弱{
    磨损变量对象:T?
    }
    
  • 虽然我认为它必须是一个
    ,但在这种情况下

  • 或者对于某些其他机制,例如传递闭包(它弱地捕获对象)
  • 弱引用并不是这样的 有趣的是,弱引用实际上并不指向它们所建模的目标对象。它们指向副表,其生存期与目标对象不同

    • 当对对象进行第一次弱引用时,会分配一个边表条目
    • 创建每个弱引用都会增加边表项的ref计数,而每次销毁弱引用都会减少它
    • 一旦目标对象被解除分配,边表条目将保持不变。这样,所有弱引用就不会变成悬空指针
    • 最终解除分配目标对象后,所有访问弱引用的尝试(现在已停止)都会导致弱引用被
      nil
      -ed输出(这是您作为用户观察到的),但也会减少边表条目
    • 因此,每个弱引用要么需要销毁(例如超出范围),要么在边表条目过期之前尝试访问
    由于这些边表条目不暴露于“user land”Swift代码中,因此您无法生成指向它们的原始指针,因此您无法以这种方式处理弱引用

    交替思想 我对你能做些什么有一些想法,尽管我还没有尝试过

  • 您可以利用
    unsafemeutablerawpointer
    指针来传递
    包装,如:

    struct Weak<T: AnyObject> {
        wear var object: T?
    }
    
    struct弱{
    磨损变量对象:T?
    }
    
  • 虽然我认为它必须是一个
    ,但在这种情况下

  • 或者对于某些其他机制,例如传递闭包(它弱地捕获对象)

  • 在玩家的deinit方法中调用augraphRemoveEnderNotify是一个干净的解决方案,为什么您不喜欢它呢另一种方法是创建保留指针。这可以防止在您显式释放播放机之前释放播放机。我之所以不在deinit方法中执行此操作,是因为块中的某些代码在主线程上运行,并且可能在音频播放机被释放后尝试访问它。我不完全确定我是否理解您的意思。一旦删除通知程序,就无法调用回调块中的代码。如果在回调中分派异步代码,则可以在那里创建弱引用也许更多的代码来演示这个问题会有所帮助。在播放器的deinit方法中调用augraphRemoveEnderNotify是一个干净的解决方案,为什么您不喜欢它呢另一种方法是创建保留指针。这将防止在您显式释放播放机之前释放播放机。我不在deinit方法中执行此操作的原因是,块中的某些代码在主线程上运行,并且可能在AudioPlayer被释放后尝试访问它