Objective-C 对数组进行切片会导致索引越界错误

Posted

技术标签:

【中文标题】Objective-C 对数组进行切片会导致索引越界错误【英文标题】:Objective-C slicing an array gives index out of bounds error 【发布时间】: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 个元素。 【参考方案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]' 我所做的只是帮助您确保他的数组中有正确数量的元素。从现在开始,我会让你帮忙。

以上是关于Objective-C 对数组进行切片会导致索引越界错误的主要内容,如果未能解决你的问题,请参考以下文章

窥探Swift之数组安全索引与数组切片

使用索引/范围对数组进行切片是不是会创建数组的副本

无法对数组进行切片

python数据分析 python numpy--数组--运算,切片和索引

通过python中的索引和数组对数据框进行切片

在 Tensorflow 中使用索引对张量进行切片