【问题标题】:NSRangeException in loopNSRangeException 在循环中
【发布时间】:2013-09-12 10:40:30
【问题描述】:

我还在边做边学,所以,如果这听起来像个菜鸟问题,那可能就是这样。

我正在尝试遍历 NSDictionary(消息)并获取某个键上的值。

当我运行此代码时,我收到以下错误“* Terminating app due to unaught exception 'NSRangeException', reason: '* -[__NSArrayI objectAtIndex:]: index 4 beyond bounds [0 . . 3]'"

NSArray* keys = [messages allKeys];

int count = [keys count] ;
for (int i=0; i < count; i++) {
  for(NSString* key in keys) {
    if ([key isEqualToString:@"messagesinconversation"]) {
        NSArray* arr = [messages objectForKey:key];
        NSString *sentby = [[arr valueForKey:@"sentby"] objectAtIndex:i];

        NSLog (@"%@", sentby);

    }
}
}

有人能指出我正确的方向吗?

【问题讨论】:

  • 应该是你的 for 语句循环的问题....[for (int i=0; i
  • 为什么[[arr valueForKey:@"sentby"] objectAtIndex:i]; as iarr 数组无关,它是keys 数组的索引。

标签: ios objective-c


【解决方案1】:

我认为问题发生在

NSString *sentby = [[arr valueForKey:@"sentby"] objectAtIndex:i];
可能是arr数组计数小于keys数组计数。但是您正在根据键数运行 for 循环。用下面的代码替换
NSString *sentby = [[arr valueForKey:@"sentby"] objectAtIndex:i];
NSLog (@"%@", sentby);
代码
for(NSDictionary *dictionary in arr){
   NSString *sentby=[dictionary objectForKey:@"sentby"];
   NSLog(@"sentby is %@",sentby);
}

【讨论】:

  • 为什么不NSArray *sentBy = [arr valueForKey:@"sentby"];
  • 我终于有机会测试你的代码了。这为我做到了。非常感谢。
【解决方案2】:

我猜问题是你运行了两个循环

检查一下,

NSArray* keys = [messages allKeys];

int count = [keys count] ;
for (int i=0; i < count; i++) {
    NSString *key=[keys objectAtIndex:i];
        if ([key isEqualToString:@"messagesinconversation"])
        {
            NSArray* arr = [messages objectForKey:key];
            NSString *sentby = [[arr valueForKey:@"sentby"] objectAtIndex:i];

            NSLog (@"%@", sentby);

        }

}

【讨论】:

    【解决方案3】:

    问题是 NSString *sentby = [[arr valueForKey:@"sentby"] objectAtIndex:i];

    i 大于数组计数,检查 i 值和数组计数。

    在检索值时最好设置一个 if 条件

    if (i

    【讨论】:

      【解决方案4】:

      目前还不清楚您到底想做什么,但根本原因是ikeys 数组的当前索引,而不是arr 数组。

      也许你想要:

      NSArray *inconversation = [messages objectForKey:@"messagesinconversation"];
      if (inconversation) {
          NSArray *sentBy = [inconversation valueForKey:@"sentby"];
          for (NSString *sender in sentBy) {
              NSLog (@"%@", sender);
          }
      }
      

      (当您想要一个特定元素时,为什么还要麻烦遍历字典键?)

      【讨论】:

        【解决方案5】:

        不需要在此数组中获取 objectAtIndex 的值。所以请查看我编辑的代码

        NSArray* keys = [messages allKeys];
          for(NSString* key in keys)
          {
            if ([key isEqualToString:@"messagesinconversation"])
            {
                NSArray* arr = [messages objectForKey:key];
                NSString *sentby = [arr valueForKey:@"sentby"]; // here's your problem. 
        
                NSLog (@"%@", sentby);
        
            }
         }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-02-07
          • 1970-01-01
          • 1970-01-01
          • 2014-05-10
          • 1970-01-01
          • 2018-07-28
          • 2015-12-12
          • 2018-07-26
          相关资源
          最近更新 更多