2011-08-21 3 views
0

배열에 객체를 추가하려고 할 때 전체 (용량 = 10) 일 때 모든 값을 앞으로 이동하고 첫 번째 (시프트 레지스터 등)를 지우려면배열 비욘드 경계?

다음을 수행하려고했습니다. 그것은 allways 8 후 8의 한계를 넘어 있기 때문에, 10 후 충돌! ??

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 + 1'에서'count'까지 복사 *하는 대신 * 요소를 제거하지 않을 수도 있습니다. –