2012-02-27 2 views
2

두 가지 반복 방법에 문제가 있습니다.목표 C에서의 두 가지 반복 방법의 차이점은 무엇입니까?

NSArray *array=[[NSArray alloc] initWithObjects:@"A",@"B",@"C",@"D",nil]; 

NSMutableArray *mutArray=[[NSMutableArray alloc] initWithArray:array]; 

내가 같이 수행 할 때 그것은 올바른

for (int i=0;[mutArray count]!=0;) { 
    [mutArray removeObjectAtIndex:i]; 
} 
NSLog(@"%d,",[mutArray count]); 

을 일하고있어하지만 난 이렇게 할 때, 그것은 충돌거야 ... 왜?

for(id obj in mutArray) 
{ 
    [mutArray removeObject:obj] 
} 
NSLog(@"%d,",[mutArray count]); 

두 번째 사례에 대한 해결책을 제공해주십시오.

+0

이 게시물을 확인하십시오. http://stackoverflow.com/questions/5826336/remove-items-in-a-for-loop-without-side-effects - 배열에서 항목을 삭제할 수없는 이유 빠른 for 루프를 사용합니다. –

+0

@ joerick의 답변은 자리에 있지만 단지 FYI 존재합니다 :'[mutArray removeAllObjects];';) – deanWombourne

답변

2

두 번째 경우를 빠른 열거 형이라고합니다. 패스트 열거 형의 구현 세부 사항 때문에 패스트 열거되는 동안 배열을 편집 할 수 없습니다.

나는 종종 다음을 수행하여이 문제를 해결하기 :

for(id obj in [[mutArray copy] autorelease]) 
{ 
    [mutArray removeObject:obj] 
} 
NSLog(@"%d,",[mutArray count]); 

당신이 배열의 임시 사본을 통해 반복하는을하고있는이 방법,하지만 당신은 통과 당신이 원본을 수정할 수 있습니다.

p.s. 빠른 열거 형은 열거 형의 시작 부분에서 내용의 C 배열을 객체에 요청하여 빠른 열거 중에 편집 할 수 없습니다. 일단 그것이 얻어지면, 열거 사이에 Objective-C 메시지 호출이 없으므로 반복이 빠릅니다. 그러나 배열을 수정하면 C 배열이 더 이상 유효한 내용으로 표시되지 않으므로 예외가 발생합니다.

2

빠른 열거 중에 컬렉션을 변경하면 안됩니다.

빠른 열거 형은 컬렉션에서 요소 그룹을 요청하여 작동합니다. 이는 성능과 정확성을 위해이 작업을 수행합니다. 요소의 일부를 열거하기 때문에 프로그램은 항상 컨테이너에 왕복 할 필요가 없습니다. 그러나 열거 자의 뒤에서 컬렉션을 변형하면 정확성과 객체 수명에 대한 모든 보장이 손실됩니다.

이 경우 콘솔에 오류가 표시됩니다.

다음을 참조하십시오 : -removeAllObjects.

+0

당신은 저에게이 이유가 무엇인지 말해 줄 수 있습니까? –

+0

@maddycoder 업데이트 – justin

+1

ref에 대한 링크가 하나 더 있습니다. https://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/Chapters/ocFastEnumeration.html – Hanon

0

나의 제안 :

NSMutableArray *temps = [NSMutableArray array]; 
for(id obj in mutArray) 
{ 
    // checking condition here 
    [temps addObject:obj]; 
} 
[mutArray removeObjectsInArray:temps]; 
0

컬렉션 돌연변이는 열거를 무효화합니다. 열거자는 변경 내용을 '검색'하고 오류를 트리거합니다. 빠른 목록에서 제거해야 할 항목을 표시하거나 1 위에서 색인 생성을 사용할 수 있습니다.

관련 문제