我目前正在使用AudioQueue服务,我遇到了一个小问题。
AudioQueue有一堆回调,每个回调都可以携带一个“用户数据”,基本上是一个指针。我希望我可以将我的一个对象作为这个指针传递。
所以会发生的事情是,在某些情况下,AudioQueue以接近此的方式调用我的回调:
static void HandleOutputBuffer (
void *aqData,
AudioQueueRef inAQ,
AudioQueueBufferRef inBuffer
) {
MyPlayerData *mpd = (MyPlayerData *)aqData;
...
}
这通常效果很好,但是当我的播放器到达媒体的末尾时,它会被取消分配。但是,在HandleOutputBuffer
对象被释放后,通常会调用回调MyPlayerData
,从而产生一个很好的段错误。
我希望我可以使用弱引用。有没有办法让我有一个ARC void *
指针?只要取消分配对象,就会将其设置为nil?
我目前正在关注__weak
,但我不确定这是否是正确使用的工具......
答案 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