2010-05-24 2 views
4

위험없이 나는 어리석게 말하는거야 범위 에러.시험 범위 에러

NSMutableArray에 특정 인덱스에 대해 어떤 것이 있는지 여부를 묻는 방법은 무엇입니까?

답변

9

NSArray 클러스터 클래스는 nil을 저장할 수 없습니다. 그래서 단순히 경계를 확인하기에 충분하다 생각 : 정말 유용 무엇

NSUInteger index = xyz; 
if (index < [imageCache count]) { 
    id myObject = [imageCache objectAtIndex:index]; 
} 
+0

+1'NSArray'는'nil'을 저장할 수 없지만'[NSNull null]'을 저장할 수 있습니다 ... –

+0

좋아요, 다음에 관련된 질문입니다.이 이미지들을 비동기 적으로로드하고 있습니다. , 그들은 모두 다른 크기입니다. 따라서 그들이 내게 들어갈 순서를 알려주지 않습니다. 존재하지 않는 인덱스에 대해'[imageCache insertObject : image atIndex : index]'를 실행하려고하면 범위 에러가 발생합니다 . NSArrays는 연속적이어야합니까? –

+0

왜'NSMutableArray' 메쏘드'-addObject :'를 사용하지 않을까요? http://developer.apple.com/mac/library/documentation/cocoa/reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.html#//apple_ref/doc/uid/20000138-BABDEFAA –

1
if (index < [imageCache count]) 
    ... 
+0

인덱스가 음수이면 어떻게됩니까? – AlBeebe

+1

@AlBeebe, 오류도 발생합니다. – Vladimir

0

[imageCache 개수]는 배열에있는 항목 수를 반환합니다. 거기에서 가져 가십시오 :-)

+0

신경 쓰지 마세요! 내가 참조! –

0

[imageCache 카운트]로 배열의 항목 수를 먼저 확인하십시오. 그 결과보다 큰 지수를 가진 것을 요구하지 마십시오.

+0

인덱스가 음수이면 어떨까요? – AlBeebe

7

safeObjectAtIndex: 방법을 가지고있다. 그러면 색인이 범위를 벗어나면 nil이 반환됩니다.

그냥있는 NSArray에 새로운 카테고리를 생성하고 다음과 같은 방법을 포함한다 :

- (id)safeObjectAtIndex:(NSUInteger)index; 
{ 
    return ([self arrayContainsIndex:index] ? [self objectAtIndex:index] : nil); 
} 

- (BOOL)arrayContainsIndex:(NSUInteger)index; 
{ 
    return NSLocationInRange(index, NSMakeRange(0, [self count])); 
} 
+0

카테고리의 좋은 사용. –

+0

'arrayContainsIndex'도 NSArray 카테고리에서 생성 한 것입니까? 문서에는 그런 방법이 언급되어 있지 않습니다. 솔직히 그러한 것이 존재한다면, 저는 그것을 사용합니다! –

+0

죄송합니다. 잊어 버렸습니다. arrayContainsIndex : 메소드를 사용하여 답변을 업데이트했습니다. – diederikh

1

이 코드는 귀하의 질문에 대답을 제공합니다. 허용 된 응답과 달리이 코드는 음수 인덱스 값 전달을 처리합니다.

if (!NSLocationInRange(index, NSMakeRange(0, [imageCache count]))) { 
    // Index does not exist 
} else { 
    // Index exists 
}