问题在标题中:“如果我有ARC,我是否需要释放SystemSoundID?”这是我的代码:
NSURL *pathURL = [NSURL fileURLWithPath:path];
SystemSoundID soundid;
AudioServicesCreateSystemSoundID((__bridge_retained CFURLRef)pathURL, &soundid);
AudioServicesPlaySystemSound(soundid);
如果是这样,我什么时候发布它? (我没有dealloc方法,因为我使用静态方法而且无法更改)
此外,这是目前播放音效的最佳方式我听说这个框架现已弃用。
谢谢!
答案 0 :(得分:4)
是的,你确实需要发布它。 ARC只关注Obj-C对象,而SystemSoundID
不是obj-c对象。在某些时候,您需要在AudioServicesDisposeSystemSoundID()
值上调用SystemSoundID
。您可以使用系统声音完成例程(使用AudioServicesAddSystemSoundCompletion()
)执行此操作。
至于塞尔吉奥在谈论什么,你正在泄漏pathURL
对象。您使用了__bridge_retained
,它将对象的所有权转移到CoreFoundation。您应该将其更改为(__bridge CFURLRef)pathURL
,这不会转移所有权。 AudioServices API将根据需要保留对象。
答案 1 :(得分:1)
(__ bridge_retained T)op将操作数(必须具有可保留的对象指针类型)强制转换为目标类型,该目标类型必须是不可保留的指针类型。 ARC保留该值,取决于对本地值的通常优化,并且收件人负责平衡+1。
因此,您需要进行发布。
换句话说,桥接演员中发生的事情是pathURL
的所有权传递给CF,然后传播到ARC范围之外。