2

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

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

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

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

谢谢!

4

2 回答 2

4

是的,您确实需要释放它。ARC 只关注 Obj-C 对象,aSystemSoundID不是 obj-c 对象。在某些时候,您确实需要呼吁AudioServicesDisposeSystemSoundID()您的SystemSoundID价值。您可以使用系统声音完成例程(使用AudioServicesAddSystemSoundCompletion())来做到这一点。

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

于 2012-06-28T22:32:19.037 回答
1

根据clang ref

(__bridge_retained T) op 将必须具有可保留对象指针类型的操作数强制转换为必须是不可保留指针类型的目标类型。ARC 保留该值,但需对本地值进行通常的优化,并且接收者负责平衡该 +1。

因此,您需要进行发布。

换句话说,在桥接中发生的事情是所有权pathURL被传递给 CF,然后超出了 ARC 范围。

于 2012-06-28T22:28:55.060 回答