0

次のコードを使用して、オブジェクトが存在するかどうかを確認してから、存在する場合は削除しています。

if(titlescopy.count >= i)
{
   if([[titlescopy objectAtIndex:i] isKindOfClass:[NSString class]])
   {
       [titlescopy removeObjectAtIndex:i];
   }
}

ただし、次のエラーが発生します。

* Uncaught Exception 'nsrangeException'、理由: ' * - [__ nsarraym objectAtindex:]:Index 2 Beyond Bounds [0 .. 1]' *最初のスローコールスタック:(0x365A56C3 0x3881E97F 0x364F1055 0x3888148484848484848484815775775775775775757757575757575749494年の0x3805f8e5 0x3805f897 0x3805f875 0x3805f12b 0x3805f621 0x37f87d29 0x37f74f29 0x37f74843 0x34ea25d3 0x34ea2203 0x3657a593 0x3657a537 0x365793b9 0x364ec39d 0x364ec229 0x34ea131b 0x37fc88f9 0x283b 0x2798) libc++abi.dylib: terminate called throwing an exception (lldb)

なぜこうなった?私が使用しているコードは、オブジェクトを削除しようとする前にオブジェクトが存在するかどうかを確認する必要がありますが、明らかにそうではありません。

ありがとう!

4

3 に答える 3

5

Objective-Cの配列インデックスは0から始まるため、i=titlescopy.countは範囲外です。ifステートメントを次のように変更します。

if(titlescopy.count > i)
于 2012-09-08T14:23:48.207 に答える
4

これに対する答えはあなたのログ自体にあります...

* Terminating app due to uncaught exception 'NSRangeException', reason: '* -[_**_NSArrayM objectAtIndex:]: index 2 beyond bounds [0 .. 1]'**

範囲外のインデックスを参照しています...たとえば、配列サイズが3であると考えますが、4番目のオブジェクトを参照しています。したがって、以下のインデックスが重要かどうかを確認するのが最善です。もしそうなら、あなたが望むものを続けてください。

// mistake is "i" should not be equal to count...
if(i < titlescopy. count)
{
     if([[titlescopy objectAtIndex:i] isKindOfClass:[NSString class]])
     {
         [titlescopy removeObjectAtIndex:i];
     }
}
于 2012-09-08T14:26:09.510 に答える
0

//if(titlescopy.count> = i)">="が間違っています。それを>"にしましょう

「i」は、配列のカウントa=よりも小さくする必要があります

if(titlescopy.count > i)
{
    if([[titlescopy objectAtIndex:i] isKindOfClass:[NSString class]])
    {
        [titlescopy removeObjectAtIndex:i];
    }
}
于 2012-09-08T17:49:34.897 に答える