C回调中的ARC弱引用

时间:2013-10-15 12:58:02

标签: ios objective-c automatic-ref-counting

我目前正在使用AudioQueue服务,我遇到了一个小问题。

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

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

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

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

我希望我可以使用弱引用。有没有办法让我有一个ARC void *指针?只要取消分配对象,就会将其设置为nil?

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

1 个答案:

答案 0 :(得分: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