【问题标题】:why iOS App terminating due to NSRangeException为什么iOS App由于NSRangeException而终止
【发布时间】:2014-01-17 23:28:45
【问题描述】:

我有一个奇怪的错误弹出。它列出了我的应用是

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array'

让我感到困惑的是,该应用程序在模拟器中运行得非常好,但是当我在我的设备上对其进行测试时,我得到了这个错误。我已将问题隔离到以下代码行:

updatingTracker = [userDatas objectAtIndex:repeatCount];

下面是其余的相关代码:

[self getUserDatas];
[self timerDidFire];

-(void) getUserDatas
{
    userDatas = [[NSMutableArray alloc] init];
    NSUserDefaults *userdef = [NSUserDefaults standardUserDefaults];
    int count = [[userdef objectForKey:@"user_count"] intValue];
    for(int i=0;i<count;i++)
    {
        NewTracker *newtrack=[[NewTracker alloc] init];
        newtrack.FromCurrency = [userdef objectForKey:[NSString stringWithFormat:@"from_string_%d",i]];
        newtrack.ToCurrency   = [userdef objectForKey:[NSString stringWithFormat:@"to_string_%d",i]];
        newtrack.savedCurrency = [userdef objectForKey:[NSString stringWithFormat:@"save_currency_%d",i]];
        newtrack.userTarget = [userdef objectForKey:[NSString stringWithFormat:@"user_target_%d",i]];
        newtrack.trackerId = [userdef objectForKey:[NSString stringWithFormat:@"tracker_id_%d",i]];
        newtrack.realtimeBase = [userdef objectForKey:[NSString stringWithFormat:@"realtime_base_%d",i]];
        newtrack.realtimeTarget = [userdef objectForKey:[NSString stringWithFormat:@"realtime_target_%d",i]];
        newtrack.realtimeUSD = [userdef objectForKey:[NSString stringWithFormat:@"realtime_USD_%d",i]];
        [userDatas addObject:newtrack];
    }
}

- (void) timerDidFire
{
    NSLog(@"bug finder");

    updatingTracker = [userDatas objectAtIndex:repeatCount];
    [self chartconnectionStart:@"3m"];
}

任何关于为什么会发生这种情况或如何解决它的想法或帮助将不胜感激。

【问题讨论】:

  • 错误信息告诉你到底出了什么问题。 count 可能被设置为 0,因此您分配数组但从不向其中添加任何对象,当您尝试访问它时,您会收到 NSRangeException 错误。试试int count = 10 看看会发生什么 - 如果它有效,您就知道下一步该去哪里了。
  • 谢谢,成功了。导致其他错误,但现在我至少了解发生了什么。欣赏!

标签: ios iphone objective-c ios-simulator nsrangeexception


【解决方案1】:

您的 userDatas 数组为空。您很可能没有在手机上的用户默认值中填充任何内容,因此添加到数组的代码永远不会执行。您的模拟器上可能已经填充了一些数据,这就是它无法在手机上运行的原因

【讨论】:

  • 就是这样。谢谢!
  • 我注释掉了 [self timerDidFire] 行,它完全修复了应用程序。它不应该在应用启动时触发,因为就像你说的那样,用户默认值中没有数据。
【解决方案2】:

简单地在该行上为条件[userDatas count] == 0 放置一个条件断点。或者输入一个if 来捕捉它并在其上设置一个断点。他们使用调试器来确定您是如何到达那里的以及相关的值是什么。

基本调试。

【讨论】:

    【解决方案3】:

    这样的代码

    • (void) timerDidFire{

      NSLog(@"bug finder");

      if([userDatas 计数]>0){

      updatingTracker = [userDatas objectAtIndex:repeatCount];

      [self chartconnectionStart:@"3m"];

      }

    }

    愉快的编码............

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多