【问题标题】:Objective-C slicing an array gives index out of bounds errorObjective-C 对数组进行切片会导致索引越界错误
【发布时间】:2014-04-09 11:25:05
【问题描述】:

尝试执行以下操作:

NSMutableArray *tmpArr = [_tweets subarrayWithRange:NSMakeRange(0, 10)];
_tweets = [[NSMutableArray alloc] init]; // added this in trial and error debugging
_tweets = tmpArr;

_tweets 是一个NSMutableArray,我正在尝试从中获取前 10 个对象。

但是,我收到以下错误:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 157 beyond bounds [0 .. 9]'

有什么想法吗?

【问题讨论】:

  • 这段代码后出现错误。
  • 当您尝试从该数组中抓取前 10 个对象时显示代码。
  • @nhgrif 哦,什么!?调试器是否给出错误源自的任何形式的行号/类?
  • @Greg Er,这是它吗:[_tweets subarrayWithRange:NSMakeRange(0, 10)]; 仍然是 iOS n00b :)
  • 没有。但是在发布的代码中,您没有尝试访问第 157 个元素。

标签: objective-c


【解决方案1】:

错误发生在这段代码之后的某个时间点。

你从 _tweets 开始,正如你所说的一个 NSMutableArray,其中大概有 157 多个元素。

您从_tweets 数组中取出前10 个元素并将其分配给tmpArr,另一个NSMutableArray。

现在...您使用原始的 _tweets 数组,重新分配并重新初始化它(考虑到以下行,这是多余的。并将 _tweets 设置为指向相同的内存位置 tmpArr 指向.

现在您有两个数组指针,_tweetstmpArr。它们都指向完全相同的内存位置,并且在该内存位置有一个 NSMutableArray,其中包含 10 个元素——最初位于 _tweets 中的前 10 个元素。

在执行此代码后的某个时间点,您尝试访问这两个数组指针之一的第 157 个元素(同样指向同一个数组)。但是最高指数是9,所以引发了异常。抛出异常的代码行没有贴在问题中。

【讨论】:

    【解决方案2】:

    在您尝试抓取子范围之前添加此内容:

    NSLog("%ul", _tweets.length);
    NSMutableArray *tmpArr = [_tweets subarrayWithRange:NSMakeRange(0, 10)];
    

    那么,至少你会知道数组包含预期数量的元素。

    您可能还想在 Xcode 中启用保护 malloc,因为您似乎遇到了内存/指针问题。 Xcode - scribble, guard edges and guard malloc

    【讨论】:

    • 为什么?当应用程序崩溃(此代码不会阻止)时,它会告诉您尝试获取越界索引的数组的大小。看到他的错误信息了吗? *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 157 beyond bounds [0 .. 9]'
    • 我所做的只是帮助您确保他的数组中有正确数量的元素。从现在开始,我会让你帮忙。
    猜你喜欢
    • 2015-01-10
    • 2017-07-26
    • 1970-01-01
    • 2016-08-26
    • 2014-06-06
    • 2015-03-22
    • 1970-01-01
    相关资源
    最近更新 更多