2011-08-21 80 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'的替代方法,并且不会删除任何元素。 –