数组超出界限?

时间:2011-08-21 12:03:55

标签: objective-c

我们正在尝试将对象添加到数组中,并且当它满时(容量= 10)时,将所有值向前移位并擦除第一个(例如移位寄存器)

我试图做下一个并且它在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++;

当我尝试不删除对象时,我得到另一个错误。 我究竟做错了什么? 为什么我不能为某些索引添加值,当他有空格索引时? ? 非常感谢。

2 个答案:

答案 0 :(得分:5)

你实际上不必这样做,因为NSArray将自己执行元素的“下滑”:

  

为了填补空白,索引之外的所有元素都会通过从索引中减去1来移动。

NSMutableArray

所以

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

应该足够了。 NSMutableArray的行为更像Java中的ArrayList或C#中的List,而不像普通的C数组。

答案 1 :(得分:2)

当您的内循环count8时,您正在访问索引9的对象,该对象超出范围。使循环更短,并在循环之后摆脱removeObject

(你没有将移动到最后一个插槽中。)

环形缓冲区的另一种实现方式是避免移动元素并只保留指向缓冲区当前末端的指针,因此您可以动态地(在恒定时间内)动态计算索引,而不是而不是移动物体。