这是我的.m文件中的内容,来自xcode。 我的主要目标是当一个按钮播放一个声音(不是同时),当它有2个声音文件和一个随机发生器,因此它不会播放相同的声音两次或不会两次播放。我运行代码,当我单击是按钮时,会发生lldb NSEsception错误。我四处寻找lldb异常错误,但我找到的解决方案是进入视图控制器删除任何带有黄色感叹号的东西;这并没有解决问题..
#import "ViewController.h"
#import <AVFoundation/AVAudioPlayer.h>
@interface ViewController ()
@end
@implementation ViewController : UIViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)Yes{
NSMutableArray *array=[NSMutableArray
arrayWithObjects:
@"yes.mp3",
@"yes 3.mp3",
nil];
int i=0;
for(i=0;i<=[array count]; i++)
{
NSInteger rand=(arc4random() %1);
[array exchangeObjectAtIndex:i
withObjectAtIndex:rand];
}
NSString *sound = [array objectAtIndex:i];
AVAudioPlayer* audioPlayer=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:
[[NSBundle mainBundle]pathForResource:sound ofType:@"mp3"]] error:NULL];
[audioPlayer play];
}
@end
答案 0 :(得分:1)
for(i=0;i<=[array count]; i++)
应该变成
for(i=0;i<[array count]; i++)
否则你会离开数组边界。
您还应该仔细检查rand
变量的值范围,看看它是否永远不会超过数组大小 - 1。
例如:
NSInteger rand=MIN((arc4random() %1), array.count - 1);
答案 1 :(得分:0)
你有四个问题。您的循环范围,随机值的计算以及循环后的数组索引使用情况,并指定声音文件的扩展名两次。
循环和随机值应为:
for(NSUInteger i = 0; i < [array count]; i++) {
NSInteger rand = arc4random_uniform(array.count);
[array exchangeObjectAtIndex:i withObjectAtIndex:rand];
}
<=
现在是<
。目前还不清楚你想在循环后获得sound
值。如上所述,您尝试使用i
来访问,这将太大。您需要指定0
到array.count - 1
范围内的值。
如果您只想要数组中的第一个(现在是随机的)值,请使用:
NSString *sound = [array firstObject];
<强>更新强>
在意识到你真的想要随机播放两种声音之一后,我认为你的代码可以简化为:
- (IBAction)Yes {
NSInteger rand = arc4random_uniform(2);
NSString sound = rand == 0 ? @"yes" : @"yes 3";
NSURL *url = [[NSBundle mainBundle] URLForResource:sound withExtension:@"mp3"];
AVAudioPlayer* audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
[audioPlayer play];
}