2012-09-08 52 views
0

我使用下面的代碼來檢查,如果它取出前一個對象是否存在:NSArray的removeObjectAtIndex錯誤

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

不過,我得到這個錯誤:

* Terminating app due to uncaught exception 'NSRangeException', reason: '* -[__NSArrayM objectAtIndex:]: index 2 beyond bounds [0 .. 1]' * First throw call stack: (0x365a56c3 0x3881e97f 0x364f1055 0x494b 0x37fdb8d5 0x37fe7d75 0x37fe7a81 0x38001ddd 0x38001b97 0x172bd 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)

爲什麼這是否發生?我正在使用的代碼應該在試圖刪除它之前檢查對象是否存在,顯然不是。

謝謝!

+0

注意,這是極爲奇數要使用'isKindOfClass:'以這種方式來過濾數組內容。一般來說,使用'isKindOfClass:'代表弱結構。 – bbum

回答

5

Objective-C中的數組索引從0開始,所以i = titlescopy.count超出範圍。改變你的if語句:

if(titlescopy.count > i) 
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]; 
    } 
} 
0

//if(titlescopy.count> = I) 「> =」 是錯誤的。使該成「>」

「i」的應小於所述計數陣列的=

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