내가 배열을 통해 반복을보고 있었고, 난이 방법을 우연히 발견 -왜 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
을 제대로 이해하지 못합니까? 비표준 동작을 사용하고자 할 때
소년 내가 지금 바보 같아요 –
내 코드에서 이와 같은 옵션 열거 형을 작성할 때 열거 형 시작 부분에 항상 값이 0 인 표준 또는 '기본'옵션이 포함되므로 동작이 명확합니다. 모든 경우에, 당신은 이것이 애플의 끝에서 불분명 한 API라고 말할 수있다. – Greg
대신 "enumerateObjectsUsingBlock :"을 사용하여 (이 경우) 옵션에서 0을 전달합니다. 옵션의 0은 Concurrent로 변환됩니다. 즉, 어떤 객체가 비 결정적으로 반환 될 수 있기 때문에 사용하려는 객체가 아닐 수 있습니다. 객체 ID 1이 객체 id 0 앞에 올 수 있습니다. –