C回调中的ARC弱引用

asp*_*yct 1 objective-c ios automatic-ref-counting

我目前正在玩AudioQueue服务,我遇到了一个小问题.

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

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

static void HandleOutputBuffer (
    void                *aqData,
    AudioQueueRef       inAQ,
    AudioQueueBufferRef inBuffer
) {
    MyPlayerData *mpd = (MyPlayerData *)aqData;
    ...
}
Run Code Online (Sandbox Code Playgroud)

这通常很有效,但是当我的播放器到达媒体的末尾时,它会被取消分配.但通常HandleOutputBufferMyPlayerData对象被释放后调用回调,从而产生一个很好的段错误.

我希望我可以使用弱参考.有没有办法让我有一个ARC void *指针?每当对象被释放时,将被设置为nil的东西?

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

Mar*_*n R 5

如果取消分配void *对象,ARC无法管理对象的引用并将其设置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