enumerateObjectsUsingBlock : 사용되는 BOOL * stop 인수는 무엇입니까?


87

나는 enumerateObjectsUsingBlock:최근에 빠른 열거 요구 사항을 위해 많이 사용 BOOL *stop하고 있으며 열거 블록에서의 사용법을 이해하는 데 어려움을 겪고 있습니다.

NSArray클래스 참조 상태

stop: 부울 값에 대한 참조입니다. 블록은 YES배열의 추가 처리를 중지 하기 위해 값을 로 설정할 수 있습니다 . stop인수는 아웃 전용 인수입니다. 이 부울 YES은 블록 내 에서만 설정해야합니다 .

따라서 물론 열거를 중지하기 위해 블록에 다음을 추가 할 수 있습니다.

if (idx == [myArray indexOfObject:[myArray lastObject]]) {
    *stop = YES;
}

내가 말할 수있었습니다 바로는, 명시 적으로 설정하지 않는 *stop하기 위해 YES어떤 부정적인 부작용이 없습니다. 열거 형은 배열의 끝에서 자동으로 중지되는 것 같습니다. 그래서 *stop블록에서 정말 필요합니까?

답변:


156

stopBlock에 대한 인수를 사용하면 열거를 조기 에 중지 할 수 있습니다 . break일반 for루프 와 동일 합니다. 배열의 모든 개체를 살펴 보려면 무시할 수 있습니다.

for( id obj in arr ){
    if( [obj isContagious] ){
        break;    // Stop enumerating
    }

    if( ![obj isKindOfClass:[Perefrigia class]] ){
        continue;    // Skip this object
    }

    [obj immanetizeTheEschaton];
}

[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if( [obj isContagious] ){
        *stop = YES;    // Stop enumerating
        return;
    }

    if( ![obj isKindOfClass:[Perefrigia class]] ){
        return;    // Skip this object
    }

    [obj immanentizeTheEschaton];
}];

호출 범위의 변수에 대한 참조이기 때문에 out 매개 변수입니다. 블록 내부에 설정해야하지만 s 내부에서 읽는 enumerateObjectsUsingBlock:것과 같은 방식으로 NSErrors가 일반적으로 프레임 워크 호출에서 코드로 다시 전달됩니다.

- (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block {
    // N.B: This is probably not how this method is actually implemented!
    // It is just to demonstrate how the out parameter operates!

    NSUInteger idx = 0;
    for( id obj in self ){

        BOOL stop = NO;

        block(obj, idx++, &stop);

        if( stop ){
            break;
        }
    }
}

21
점을 유의 stop플래그가 자문이다; 예를 들어 동시 케이스에서 정의되지 않은 반복 횟수 동안 열거가 계속 될 수 있습니다. 즉 __block, 열거 형을 통과 할 때마다 무조건적으로 변수를 설정해서는 안되며 stop조기 종료 를 위해 사용할 때 "마지막"값이 될 것으로 기 대해서는 안됩니다 . 항상 "아니요,이 개체 사용"을 설정과 연결해야합니다 stop = YES;.
bbum

@bbum, 계속되는 동작 이 동시 열거 에만 적용되는지 여부를 명확히 할 수 있습니까? 이 경우 완벽하게 이해할 수는 있지만 문서화되어 있지 않으며 "연속"열거에 대해 상당히 놀라운 일이 될 것입니다.
jscs

4
<rdar : // problem / 15015199>는 이제 문서가 어느 쪽도 말하지 않고 있어야하기 때문에 설명을 요청합니다.
bbum
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.