我将我的项目转换为ARC。 Xcode在示例
的代码中改变了这一行soundFileURLRef = (CFURLRef) [tapSound retain];
到
soundFileURLRef = (__bridge CFURLRef) tapSound;
但没有声音播放。怎么了?
- (IBAction)buttonTapped:(UIButton *)sender {
// Create the URL for the source audio file. The URLForResource:withExtension: method is new in iOS 4.0
NSURL *tapSound = [[NSBundle mainBundle] URLForResource: @"abide" withExtension: @"aif"];
CFURLRef soundFileURLRef;
SystemSoundID soundFileObject;
// Store the URL as a CFURLRef instance
soundFileURLRef = (__bridge CFURLRef) tapSound; // I think this line is wrong
// Create a system sound object representing the sound file.
AudioServicesCreateSystemSoundID (
soundFileURLRef,
&soundFileObject
);
AudioServicesPlaySystemSound (soundFileObject);
}
答案 0 :(得分:3)
逻辑上,您的代码看起来完全正常。我怀疑您实际上没有将abide.aif
与您的应用程序捆绑在一起,或者您不小心输入了错误的名称(扩展名为aiff
?)。您可以通过在[NSBundle URLForResource:withExtension:]
调用后设置断点并检查tapSound
的内容来验证这一点。
请确保您已在“复制包资源”中为您的目标实际包含它:
此外,您应该知道,AudioServicesCreateSystemSoundID
的来电应与AudioServicesDisposeSystemSoundID
来电平衡。你在这里不必要地分配内存,ARC不会为你处理这个问题。
执行此操作的理想方法是完成所有工作,以便在SystemSoundID
或awakeFromNib
方法中创建viewDidLoad
,将其存储为ivar,并且只调用{{ 1}}在您的按钮点击方法中。在dealloc方法中,您应该调用AudioServicesPlaySystemSound
。
让我知道它是怎么回事。