2012-10-25 4 views
2

에 대한 범위를 넘는 인덱스 3 전을 기준으로 배열을 만들 사전 키의 :은 insertObject : atIndex : - 빈 배열

factsBuiltArray = [NSMutableArray arrayWithCapacity: 6]; 
if ([statusDict count] == 10) { 
    for (NSString *key in [statusDict allKeys]) { 
     if ([key isEqualToString: @"currenciesAndConversions"]) { 
      [factsBuiltArray insertObject:key atIndex: 0]; 
     } 
     else if ([key isEqualToString: @"languageAndTranslations"]) { 
      [factsBuiltArray insertObject:key atIndex: 1]; 
     } 
     else if ([key isEqualToString: @"plugSize"]) { 
      [factsBuiltArray insertObject:key atIndex: 2]; 
     } 
     else if ([key isEqualToString: @"timezone"]) { 
      [factsBuiltArray insertObject:key atIndex: 3]; // crashes over here 
     } 
     else if ([key isEqualToString: @"population"]) { 
      [factsBuiltArray insertObject:key atIndex: 4]; 
     } 
     else if ([key isEqualToString: @"wikipedia"]) { 
      [factsBuiltArray insertObject:key atIndex: 5]; 
     } 
    } 
} 

충돌 로그는 다음과 같습니다

*** -[__NSArrayM insertObject:atIndex:]: index 3 beyond bounds for empty array 

이유에 객체를 삽입 않습니다 6의 용량으로 지정된 배열은 충돌을 일으 킵니까? 매우 혼란스러워!

답변

10

용량은 컨테이너 클래스가 보유 할 수있는 객체의 수입니다. 인덱스에 삽입하려면 컨테이너에 포함 된 총 개체 수 (포함될 수있는 개체의 총 수가 아님)에 따라 인덱스가 새 개체의 유효한 위치 여야합니다.

배열의 값이 인덱스에 종속적이면 (다른 아키텍처 나 데이터 구조가 더 좋을 것 같습니다) 배열을 NSNull로 채우면 모든 인덱스가 채워지도록 할 수 있습니다. 이것은 추후 어레이에서 읽을 때 NSNull을 확인해야 할 필요가 있습니다.하지만 추가 작업이 필요할 수 있습니다. 따라서 이것이 아마도 최선의 방법이 아닌 이유입니다. 어떤 경우라도 다음과 같이 코드를 변경하여 충돌을 수정할 수 있습니다.

factsBuiltArray = [NSMutableArray arrayWithCapacity: 6]; 

for (NSUInter i = 0; i < 6; i++) { 
    [factsBuiltArray addObject:[NSNull null]]; 
} 

if ([statusDict count] == 10) { 

    for (NSString *key in [statusDict allKeys]) { 

     if ([key isEqualToString: @"currenciesAndConversions"]) { 

      [factsBuiltArray replaceObjectAtIndex:0 withObject:key]; 
     } 
     else if ([key isEqualToString: @"languageAndTranslations"]) { 

      [factsBuiltArray replaceObjectAtIndex:1 withObject:key]; 
     } 
     else if ([key isEqualToString: @"plugSize"]) { 

      [factsBuiltArray replaceObjectAtIndex:2 withObject:key]; 
     } 
     else if ([key isEqualToString: @"timezone"]) { 

     [factsBuiltArray replaceObjectAtIndex:3 withObject:key]; 

     } 
     else if ([key isEqualToString: @"population"]) { 

      [factsBuiltArray replaceObjectAtIndex:4 withObject:key]; 
     } 
     else if ([key isEqualToString: @"wikipedia"]) { 

      [factsBuiltArray replaceObjectAtIndex:5 withObject:key]; 
     } 
    } 
} 
+1

NSArrays의 용량조차도 아닙니다. 이것은 메모리 할당에 대한 힌트 일뿐입니다. 배열은 전달하는 용량보다 커질 수 있습니다 (CFArrays와 달리). – Wevah

+0

좋은 점은 NSArray가 용량에 도달하면 다시 할당된다는 것입니다. @Wevah를 지적 해 주셔서 고맙습니다. – NSProgrammer

관련 문제