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++)0upからまでループしますmessages.count-1(で停止しi == messages.countます)。

for(int i = messages.count; i > 0; i--)完全に異なるインデックスのセットである、messages.countダウンからループします。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にオブジェクトがあります。

また、2番目のケースでは、カウンターはまで移動する必要が0あります。そうしないと、最初のオブジェクト(インデックス0のオブジェクト)が考慮されません(ここでも、ハーフオープン間隔の閉じた部分は0で、開いています1つはにありarray.countます)。

全体として:2番目のループを次のように変更します

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

そしてそれはうまくいくでしょう。

于 2013-03-10T16:04:28.610 に答える