【问题标题】:NSArray index 1 beyond bounds for empty arrayNSArray 索引 1 超出空数组的范围
【发布时间】:2012-10-26 23:12:32
【问题描述】:
-(IBAction)someMethod:(UIStepper *)sender{
    int x=sender.value; //This is an integer from 0-8;
    NSLog(@"%f",sender.value);
    NSArray *rpmValues = [[NSArray alloc]initWithObjects:@"a",@"b",@"c",@"d",@"e",@"f",@"g",@"h",@"i", nil];
    if (x<=[rpmValues count]) {

        myLabel.text = [rpmValues objectAtIndex:x];
    }
    NSLog(@"%i",[rpmValues count]);
}

上面是我的代码,我想做的是通过改变 UIStepper 来改变 UILabel 的显示。这是非常直接的。但是当我改变按下步进值时,它会崩溃:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -   [__NSArrayM objectAtIndex:]: index 1 beyond bounds for empty array'
*** First throw call stack:

[rpmValue 计数] 是 9。我真的很困惑。谁能帮帮我?

【问题讨论】:

  • 除了if 语句需要使用&lt; 而不是&lt;=,这段代码看起来没问题。您是否 100% 确定错误来自此代码而不是其他地方?
  • 手动设置 int x 为 1 似乎对我有用,你可以试试这个吗?你的 NSLog 语句是错误的,NSLog(@"%d",sender.value); 打印什么?一定是其他原因导致了问题。
  • 问题出在 x = [rpmValues count] 时。在该索引处获取对象不起作用,因为索引从 0 开始。
  • 您不应该能够从您发布的代码中获得此错误消息——我试过了,它工作正常,直到最后一项可以像 cmets 所说的那样修复。所以,我相信你的错误在别处。
  • 另外,您的错误指向一个可变数组,而 rpmValues 是不可变的。你应该在你的项目中添加一个异常断点,这样错误发生的行就会被高亮显示。

标签: objective-c ios xcode


【解决方案1】:

该代码看起来不错(请参阅我对问题的评论);您的问题可能来自使用

if (x<=[rpmValues count]) {

这将包括数组的计数,超出索引范围一。使用

if (x < [rpmValues count]) {

【讨论】:

    【解决方案2】:

    至少if (x&lt;=[rpmValues count]) 应该是if (x&lt;[rpmValues count])。否则,如果您有一个包含两个实体的数组,那么您就可以访问索引 0、1 和 2 — 总共三种可能性。

    您是否可以根据类似的逻辑在您的“9”步进器上设置maximumValue

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      • 2018-04-11
      • 1970-01-01
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多