массив бейод в границах? - PullRequest
0 голосов
/ 21 августа 2011

мы пытаемся добавить объекты в массив, а при его заполнении (емкость = 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 ]

5 голосов
/ 21 августа 2011

На самом деле вам не нужно делать это таким образом, так как NSArray выполнит «понижение» элементов самостоятельно:

Чтобы заполнить этот пробел, все элементы за пределами индекса перемещаются путем вычитания 1 из их индекса.

( NSMutableArray )

So

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

должно быть достаточно. NSMutableArray ведет себя больше как ArrayList в Java или List в C # и меньше как простой массив C.

2 голосов
/ 21 августа 2011

Когда во внутреннем цикле count равен 8, вы обращаетесь к объекту с индексом 9, который находится за пределами. Сделайте петлю на 1 короче и избавьтесь от removeObject сразу после петли.

(Вы ничего не перемещаете в последний слот.)

Альтернативная реализация кольцевого буфера позволит избежать перемещения элементов и просто держать указатель на текущий конец буфера, поэтому вы будете динамически вычислять индексы динамически (в постоянном времени), а не перемещать объекты вокруг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...