【问题标题】:NSArray loop issueNSArray 循环问题
【发布时间】:2013-02-25 18:49:50
【问题描述】:

我在 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

【问题讨论】:

  • for(int i = messages.count - 1; i >= 0; i--) - 数组中的编号从零开始

标签: objective-c c for-loop nsarray


【解决方案1】:

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

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

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

【讨论】:

  • 为什么这个答案被否决了?应该等待它可能是一个拼写错误,但概念是正确的
【解决方案2】:

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

for(int i = messages.count; i &gt; 0; i--)messages.count 循环到 1,这是一组完全不同的索引。

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

改为,或use this:

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

或者直接使用reverseObjectEnumerator:

for(id element in [messages reverseObjectEnumerator]) {
    ...
}

【讨论】:

    【解决方案3】:

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

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

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

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

    它会正常工作的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-23
      • 2012-06-02
      • 1970-01-01
      • 2011-09-22
      相关资源
      最近更新 更多