我正在为玩具项目实现一个简单的按钮声音界面。有多个按钮,每个按钮分配有单独的声音。我在fooViewController中完成了这一切。{h,m}使用每个UIButton的'tag'属性,如下所示:
B0.tag = 0;
B1.tag = 1;
...
我还有一个声音文件数组,我在一个字符串数组中保存,填充如下:
sounds[0] = [[NSBundle mainBundle] pathForResource:@"foo" ofType:@"caf"];
sounds[1] = [[NSBundle mainBundle] pathForResource:@"bar" ofType:@"caf"];
...
现在,当触发Touch Up Inside事件按钮时,会触发以下方法:
-(IBAction)playSoundClip:(id)sender {
if(sounds[[sender tag]] != nil) {
NSError *error;
NSString *temp = [sounds[[sender tag]] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
AVAudioPlayer *av = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:temp] error:&error];
[av play]
}
}
我总是收到EXC_BAD_ACCESS异常。当我打印出字符串时,它们是机智的,并且可以预期......一些空格,我认为它将由上面的字符串编码来处理。
答案 0 :(得分:0)
您正在使用自动释放的对象填充C
数组。由于您没有获得对象的所有权,因此它们将在分配后很快发布。
我的建议是使用NSArray
实例来保存您的路径。添加路径时,它会自动保留它们。
答案 1 :(得分:-1)
您需要分配NSError *错误:
NSError * error = [[NSError alloc] init];