2011-08-21 58 views
0

我們試圖將對象添加到一個數組,並且當它的滿(容量= 10),前移的所有值和擦除所述第一(例如移位寄存器)數組beyod邊界?

我正在試圖做下和它總是在10以後崩潰,因爲9超越了8 .. ..

if (count>9) 
{ 

    for(count=0;count<9;count++)  
    { 
      NSLog(@"%@",listOfEvents); 
     [listOfEvents removeObjectAtIndex:count]; 
     [listOfEvents insertObject:[listOfEvents objectAtIndex:(count+1)] atIndex:count]; 

    } 
    [listOfEvents removeObjectAtIndex:9]; 
    [listOfEvents insertObject:event atIndex: 9];  
} 


else 
     [listOfEvents addObject:event]; 

count++; 

當我嘗試不刪除對象,我得到另一個錯誤。 我做錯了什麼? 爲什麼我不能爲某些索引添加值,當有空間索引時呢? ? 非常感謝。

回答

5

你實際上沒有做這樣,由於NSArray將執行它自己的元素「downsliding」:

填補了國內空白,超越指數的所有元素都減去1移動從他們的索引。

NSMutableArray

所以

if (count > 9) [array removeObjectAtIndex: 0]; 
[array addObject: newObject]; 

應該足夠了。 NSMutableArray的行爲更像Java中的ArrayList或C#中的List,而不像普通的C數組。

2

當你在你的內部循環count8,你正在訪問索引9,這是超出界限的對象。縮短循環的次數,並在循環之後擺脫removeObject

(你並未將任何最終插槽。)

另一個實現環形緩衝區將避免四處移動元素,只是保持一個指向緩衝區的當前結束,所以你會的動態計算您的索引動態(在固定時間內),而不是移動物體。

+0

非常感謝,我明白,但爲什麼它沒有約束?我的數組綁定是10,所以索引是0-9!我只是無法理解這種約束的事情。另外,即使我超越界限,他必須自動放大我的陣列否? – Curnelious

+1

無論何時添加或刪除元素,「NSMutableArrays」都會調整它們的大小。當大小調整時,可接受指數的範圍也是如此。 – Dirk

+1

@Dirk:謝謝。 @Rant:所以它可能是* count將元素從'count + 1'複製到'count'的替代方法,並且不會刪除任何元素。 –