[objective-c] enumerateObjectsUsingBlock : 사용되는 BOOL * stop 인수는 무엇입니까?

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

NSArray클래스 참조 상태

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

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

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

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



답변

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;
        }
    }
}


답변