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
指向.
现在您有两个数组指针,_tweets
和 tmpArr
。它们都指向完全相同的内存位置,并且在该内存位置有一个 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 对数组进行切片会导致索引越界错误的主要内容,如果未能解决你的问题,请参考以下文章