2013-03-13 2 views
7

배열의 마지막 x 번호를 잡고 다른 배열에 저장하려고합니다.NSMutableArray에서 마지막 x 객체를 가져옵니다.

이 같이 그것은 작동 :

NSMutableArray *LastLines = [[LogLines subarrayWithRange:NSMakeRange(0, [LogLines count])] mutableCopy]; 

을 그러나이되지 않습니다

NSMutableArray *LastLines = [[LogLines subarrayWithRange:NSMakeRange(([LogLines count]-4), [LogLines count])] mutableCopy]; 

다음과 같은 오류가 로그에 표시 :

2013 년 3 월 13 일 15시 : 43.475 [38565 : 303] * - [NSArray subarrayWithRange :] : 범위 {83255, 83259}가 범위를 벗어납니다. [0 .. 83258]

그러나 범위가 경계 내에 있어야하는 것처럼 보이므로이 오류가 발생하는 이유가 확실하지 않습니다.

답변

2

첫 번째는 작동하지 않아야합니다. 배열은 0부터 시작하므로 배열의 count 메서드를 호출하면 항상 마지막으로 사용 된 인덱스보다 하나가 더 많이 반환됩니다. 코드를

NSMutableArray *LastLines = [[LogLines subarrayWithRange:NSMakeRange(([LogLines count]-4), 4)] mutableCopy]; 

으로 변경하면 코드가 작동합니다. 하지만 왜 첫 번째 라인이 작동하는지 모르겠습니다.

+0

나는 다음과 같은 오류 얻을 수행 2013 년 3 월 13 일 15 : 48 : 27.112 [ 38764 : 303] *** - [NSArray subarrayWithRange :] : 범위 {86699, 86702}가 범위를 넘어 확장 됨 [0 .. 86702] 범위가 실행 가능해 보이지만 범위를 넘어서 확장됩니다. – Prognastat

+0

나는 그것을 이해했다. 범위의 두 번째 값이 첫 번째 값의 증분 값이라는 것을 오해했습니다. NSMutableArray * LastLines = [[LogLines subarrayWithRange : NSMakeRange (LogLines.count - 5, 4)] mutableCopy]; – Prognastat

0

예를 들어, 배열에 10 개의 항목이있는 경우 count은 위치 10으로 이동합니다. 이러한 배열은 위치 0에서 시작하여 위치 9까지 확장되므로 위치 10은 범위를 넘어 1이됩니다.

마지막 위치 얻을 수를 멀리 하나를 수행 범위 배열 수를 초과하는 경우 다른 답변이 제안 당신은 NSArray -subarrayWithRange: 방법을 사용할 수 있습니다

NSMutableArray *LastLines = [[LogLines subarrayWithRange:NSMakeRange(([LogLines count]-4), [LogLines count]-1)] mutableCopy]; 
3

하지만는 예를 들어 지난 10 라인 동안 점점 (조심 배열에는 4 개의 요소 만 포함됨) 예외가 발생합니다!

는이를 방지하기 위해 , 단순히 ... 배열이 먼저 계산 확인하는 if를 사용

NSArray *logs = <some long array> 
int lastLogsCount = 100; 
if (logs.count > lastLogsCount) { // check count first to avoid exception 
    logs = [logs subarrayWithRange:NSMakeRange(logs.count - lastLogsCount, lastLogsCount)]; 
} 
관련 문제