如果我有ARC,我是否需要释放SystemSoundID?

时间:2012-06-28 22:22:40

标签: objective-c ios xcode avfoundation audiotoolbox

问题在标题中:“如果我有ARC,我是否需要释放SystemSoundID?”这是我的代码:

NSURL *pathURL = [NSURL fileURLWithPath:path];
SystemSoundID soundid;
AudioServicesCreateSystemSoundID((__bridge_retained CFURLRef)pathURL, &soundid);
AudioServicesPlaySystemSound(soundid);

如果是这样,我什么时候发布它? (我没有dealloc方法,因为我使用静态方法而且无法更改)

此外,这是目前播放音效的最佳方式我听说这个框架现已弃用。

谢谢!

2 个答案:

答案 0 :(得分:4)

是的,你确实需要发布它。 ARC只关注Obj-C对象,而SystemSoundID不是obj-c对象。在某些时候,您需要在AudioServicesDisposeSystemSoundID()值上调用SystemSoundID。您可以使用系统声音完成例程(使用AudioServicesAddSystemSoundCompletion())执行此操作。

至于塞尔吉奥在谈论什么,你正在泄漏pathURL对象。您使用了__bridge_retained,它将对象的所有权转移到CoreFoundation。您应该将其更改为(__bridge CFURLRef)pathURL,这不会转移所有权。 AudioServices API将根据需要保留对象。

答案 1 :(得分:1)

根据clang ref

  

(__ bridge_retained T)op将操作数(必须具有可保留的对象指针类型)强制转换为目标类型,该目标类型必须是不可保留的指针类型。 ARC保留该值,取决于对本地值的通常优化,并且收件人负责平衡+1。

因此,您需要进行发布。

换句话说,桥接演员中发生的事情是pathURL的所有权传递给CF,然后传播到ARC范围之外。