2011-05-14 3 views
5

같은 크기의 배열이 3 개 있다고 가정 해 봅시다. 나는 모든 물건으로 무언가를해야한다. 빠른 열거, 블록 기반 열거 및 사용하여 열거 : 나는 표준 C 배열을 사용하는 경우, 우리가있는 NSArray 개체를 순환에 더 많은 방법을 가지고 목표 C와여러 NSArray 열거 형

for (i = 0; i < size; i++) { 
    doSomething(array1[i]); // or [[array1 objectAtIndex:i] doSomething]; 
    doSomethingElse(array2[i]); // or [[array2 objectAtIndex:i] doSomethingElse]; 
    doSomethingReallySpecial(array3[i]); // or [[array3 objectAtIndex:i] doSomethingReallySpecial]; 
} 

다음처럼 작성할 수 있습니다. 어느 것을 사용해야합니까? 그 이유는 무엇입니까? 차이점이 뭐야?

편집
사실이 질문은 다음과 같이 제형 화 될 수있다 : 하나는 배열의 항목의 인덱스를 사용 할 필요가있는 경우 어떤 열거를 사용 하는가?

답변

0

코드의 의도를 가장 명확하게 표현한 코드를 코드 독자에게 사용해야합니다. 이 루프를 중요한 성능 병목 현상으로 파악하지 않았다면 코드를 유지 관리하는 것이 훨씬 더 중요합니다.

즉, 빠른 열거 자체 만 (즉 for(id i in array)) 색인을 제공하지 않습니다. C 스타일 루프를 사용하지 않으려는 경우 -[NSArray enumerateObjectsUsingBlock:]은 현재 항목과 색인을 제공하며 여러 배열을 압축하는 데 사용할 수 있습니다. 필자는 다중 배열의 경우 C 스타일 접근법이 성능면에서 동등한 수준에 이르며 판독기가 더 명확해질 수 있다고 확신하지만 확실하게 프로필을 작성해야합니다.

당신이 찾고있는 것은 함수 프로그래밍의 공통 관용구이며 확실히 블록을 사용하여 GCD 위에 구현 될 수 있지만 구현에 대해서는 잘 모릅니다.

4

NSEnumerator 기반 메서드는 한 번만 열거 할 수있는 지원 된 방법이었습니다. 나는 다른 사람들보다 우위에 있다고 생각할 수 없다. 느리고 더 다루기 힘들며 다른 방법으로 대체되었다.

블록을 사용하면 많은 유연성을 얻을 수 있습니다. 방법은 여러 가지 컬렉션을 통해 열거 인수로 블록을 수용하고 그것을 사용할 수 있습니다 또한 동시에 내용을 통해 열거하는 enumerateObjectsUsingBlock:options:의 옵션 인수를 사용할 수 있습니다

- (void) doSomethingToFruits:(void(^)(id,NSUInteger,BOOL*))block 
{ 
    [apples enumerateObjectsUsingBlock:block]; 
    [bananas enumerateObjectsUsingBlock:block]; 
    [kiwis enumerateObjectsUsingBlock:block]; 
} 

,. 나는 빠른 열거 대해 마음

뭔가가 NSFastEnumeration 프로토콜은 배열이나 세트 (또는 해시 테이블 또는 무엇이든)하지만 중 하나를 받아들이는 방법을 추가 할 날 수 있다는 것입니다 여전히 인수에 확인 정적 유형이 있습니다

- (void) addObjectsFromCollection:(id<NSFastEnumeration>)coll 
{ 
    for (id obj in coll) [self addObject:obj]; 
} 

그렇지 않으면 두 문법이 다른 문맥에서 더 잘 맞는 것처럼 보입니다. 메서드의 본문이 컬렉션을 통해 열거하는 경우 빠른 열거 형을 사용하면 어떤 일이 벌어지고 있는지 명확히 알 수 있습니다. 반면에 더 큰 메서드 중간에서 모든 내용에 대해 하나 또는 두 가지 작업을 수행하려는 경우 블록 더 간결하지만,이 부분은 개인적인 취향에 달려 있다고 생각합니다.

은 부록 :

인덱스를 추적 할 경우, 블록 옵션은 인수로 인덱스를 받아들입니다.

+0

철저한 답변 주셔서 감사합니다! – adubr