2

我在 for 循环中遇到问题我将 NSArray 放入 tableview 并且我希望最后一个对象位于第一个单元格中,但它仅适用于第一个对象。

这有效:

for(int i = 0; i < messages.count ; i++)
    {
    }

但这不是:

 for(int i = messages.count; i > 0; i--)
    {
    }

错误信息是:

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 203 beyond bounds [0 .. 202]'
*** First throw call stack:
(0x32bd33e7 0x3a8c4963 0x32b1eef9 0x891d3 0x34a01579 0x34a561f7 0x34a5613d 0x34a56021 0x34a55f4d 0x34a55699 0x34a55581 0x34a26561 0x349e58c7 0x34791513 0x347910b5 0x34791fd9 0x347919c3 0x347917d5 0x349eb93f 0x32ba8941 0x32ba6c39 0x32ba6f93 0x32b1a23d 0x32b1a0c9 0x366f833b 0x34a362b9 0x8549d 0x3acf1b20)
libc++abi.dylib: terminate called throwing an exception
4

3 回答 3

4

您需要在消息计数 -1 处开始循环,如下所示:

for (int i = messages.count - 1; i >= 0; i--) 
{
   ...
}

由于messages.count将给出消息对象中包含的元素总数。数组中最大的元素索引将是messages.count - 1因为数组索引从 0 开始。

于 2013-03-10T16:02:06.980 回答
1

for(int i = 0; i < messages.count ; i++)0从到循环messages.count-1(它在 时停止i == messages.count)。

for(int i = messages.count; i > 0; i--)messages.count从down循环到1,一组完全不同的索引。

for(int i=messages.count-1; i>=0; i--)

相反,或者使用这个

int i = messages.count;
while(i --> 0) {
    ...
}

或者只是使用reverseObjectEnumerator

for(id element in [messages reverseObjectEnumerator]) {
    ...
}
于 2013-03-10T16:04:50.043 回答
0

半开区间。处没有对象[array objectAtIndex:array.count]。例如,如果您的数组包含 5 个对象,则在索引 0、1、2、3 和 4 处有对象。

此外,在第二种情况下,计数器需要直到0,否则您不会考虑第一个对象(索引为 0 的对象)(再次:半开区间的闭合部分为 0,打开一个是在array.count)。

总而言之:将第二个循环更改为

for (int i = messages.count - 1; i >= 0; i--)

它会正常工作。

于 2013-03-10T16:04:28.610 回答