2014-06-13 7 views
2

내가 배열을 통해 반복을보고 있었고, 난이 방법을 우연히 발견 -왜 NSEnumerationReverse하지 NSEnumerationForward

- (void)enumerateObjectsWithOptions:(NSEnumerationOptions)opts 
         usingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block 

NSEnumerationOptions는 다음과 같이 정의된다 - 이들에 대한 설명에서 가져옵니다

enum { 
    NSEnumerationConcurrent = (1UL << 0), 
    NSEnumerationReverse = (1UL << 1), 
}; 
typedef NSUInteger NSEnumerationOptions; 

NSHipster's blog post about enumeration -

NSEnumerationConcurrent : 블록 열거 형이 이어야 함을 지정합니다. 호출 순서는 비 결정적이며 은 정의되지 않습니다. 이 플래그는 힌트이며 일부 상황에서는 구현에 의해 무시 될 수 있습니다. 블록의 코드는 동시 호출에 대해 안전해야 이어야합니다.

NSEnumerationReverse : 열거 역방향에서 수행되어야 지정 . 이 옵션은 NSArray 및 NSIndexSet 클래스에서 사용할 수있는 입니다. 해당 동작은 NSDictionary 및 NSSet 클래스에 대해 이 정의되지 않았거나 NSEnumerationConcurrent 플래그와 함께 사용될 때 정의되지 않았습니다. NSEnumerationReverse이 존재하는 이유

for (int i=0 ; i< count; i++) 
{ 
    //stuff 
} 

내 질문은,하고 NSEnumerationForward하지 않는 -

지금 일반적으로 루프는 다음과 같이 기록됩니다. 왜 애플은 역순으로 반복하는 것이 1 번째 인덱스에서 반복하는 것보다 낫다고 생각 했는가?

역순으로 루프를 반복하면 성능상의 이점이 있습니까? 또는 NSEnumerationReverse을 제대로 이해하지 못합니까? 비표준 동작을 사용하고자 할 때

답변

2

선언 NSEnumerationOptions는 번이다 - 앞으로 반복하지 않는 다른 옵션을 지정 자동 사용되는 기본 동작입니다.

전달을 반복하려면 열거 옵션 매개 변수에 0을 전달하기 만하면됩니다.

어쨌든 옵션에 대해 0을 전달하기 때문에 어떤 옵션도 허용하지 않는 enumerateObjectsUsingBlock: 메서드를 사용하고 그렇지 않으면 똑같은 방식으로 입력하기가 더 짧습니다.

+0

소년 내가 지금 바보 같아요 –

+1

내 코드에서 이와 같은 옵션 열거 형을 작성할 때 열거 형 시작 부분에 항상 값이 0 인 표준 또는 '기본'옵션이 포함되므로 동작이 명확합니다. 모든 경우에, 당신은 이것이 애플의 끝에서 불분명 한 API라고 말할 수있다. – Greg

+0

대신 "enumerateObjectsUsingBlock :"을 사용하여 (이 경우) 옵션에서 0을 전달합니다. 옵션의 0은 Concurrent로 변환됩니다. 즉, 어떤 객체가 비 결정적으로 반환 될 수 있기 때문에 사용하려는 객체가 아닐 수 있습니다. 객체 ID 1이 객체 id 0 앞에 올 수 있습니다. –