【问题标题】:Termination because of NSEexception?因 NSE 异常而终止?
【发布时间】:2014-09-21 22:20:32
【问题描述】:

这是我的 .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

【问题讨论】:

标签: ios objective-c iphone uiviewcontroller


【解决方案1】:

for(i=0;i&lt;=[array count]; i++)

应该变成

for(i=0;i&lt;[array count]; i++)

否则你会超出数组边界。

您还应该仔细检查randvariable 的值范围,看看它是否永远不会超过数组大小 - 1。 比如:

NSInteger rand=MIN((arc4random() %1), array.count - 1);

【讨论】:

  • 点击按钮后仍然报错。我认为这与在资源路径中使用字符串声音有关,但我不确定如果声音字符串不去那里告诉 avaudio 数组在哪里以及其中的内容是什么这样就可以玩了?
  • 你能粘贴完整的例外吗? @cloudhalo
  • 这里是完整的异常 2014-09-21 18:33:12.377 Strogg[59125:90b] *** 由于未捕获的异常“NSRangeException”而终止应用程序,原因:“*** -[ __NSArrayM objectAtIndex:]: index 2 beyond bounds [0 .. 1]' *** 第一次抛出调用堆栈: ( libc++abi.dylib: 以未捕获的 NSException (lldb) 类型异常终止
  • 所以问题就是:数组越界 :) 确保 i 和 rand 都没有超过 array.count - 1
【解决方案2】:

你有四个问题。你的循环范围,随机值的计算,循环后数组索引的使用,你两次指定声音文件的扩展名。

循环和随机值应该是:

for(NSUInteger i = 0; i < [array count]; i++) {
    NSInteger rand = arc4random_uniform(array.count);
    [array exchangeObjectAtIndex:i withObjectAtIndex:rand];
}
  1. 请注意,&lt;= 现在是 &lt;。
  2. 您计算的随机数始终返回 0。

目前还不清楚你想在循环之后获得什么 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];
}

【讨论】:

  • 在资源路径的哪里指定这个值?因为目标是让按钮被点击,然后播放声音 1 或 2,然后再次点击 1 或 2(因为它有 2 个声音),所以它有点随机。
  • 仍然出现异常。 Pathforresource中放声音可以吗?
  • 查看我的更新。这要容易得多。另外,请学会在代码中使用一些空格,以便于阅读。
  • 先生是个天才,但是点击按钮时声音没有播放,我测试了将mp3文件放在文件夹中是否仍然可以播放,它这样做了为什么他们现在不播放没有异常发生?
猜你喜欢
  • 2014-08-29
  • 2019-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多