1

我目前正在使用 AudioQueue 服务,但有一个小问题。

AudioQueue 有一堆回调,每个回调可以携带一个“用户数据”,基本上是一个指针。我希望我可以将我的一个对象作为这个指针传递。

所以发生的事情是,在某些情况下,AudioQueue 以接近此的方式调用我的回调:

static void HandleOutputBuffer (
    void                *aqData,
    AudioQueueRef       inAQ,
    AudioQueueBufferRef inBuffer
) {
    MyPlayerData *mpd = (MyPlayerData *)aqData;
    ...
}

这通常效果很好,但是当我的播放器到达媒体末尾时,它会被释放。但通常HandleOutputBuffer在对象被释放后调用回调MyPlayerData,导致一个很好的段错误。

我希望我可以为此使用弱参考。有什么办法可以让我拥有一个 ARCvoid *指针?每当对象被释放时会被设置为 nil 的东西?

我目前正在查看__weak,但我不确定这是使用正确的工具...

4

1 回答 1

5

如果对象被释放,ARC 不能管理void *对对象的引用并将其设置为。NULL

从对象指针创建上下文指针时,您有两种不同的选择:

  • const void *context = (__bridge void *)mpd;

    这就是你现在要做的。在这种情况下,必须确保该对象存在,只要音频队列在回调中使用它。

  • const void *context = (__bridge_retained void *)mpd;

    增加了对象的保留计数,从而使对象“保持活动状态”,即它不会被释放。在这种情况下,您必须最终在不再需要时释放此引用,使用CFRelease(context).

参考:http ://clang.llvm.org/docs/AutomaticReferenceCounting.html#bridged-casts

于 2013-10-15T16:33:18.500 回答