Qual é o argumento BOOL * stop para enumerateObjectsUsingBlock: usado para?

Eu tenho usado enumerateObjectsUsingBlock: muito ultimamente para minhas necessidades de enumeração rápida, e eu estou tendo dificuldade em entender o uso de BOOL *stop no bloco de enumeração.

Os estados de referência da class NSArray

stop : uma referência a um valor booleano. O bloco pode definir o valor como YES para interromper o processamento adicional do array. O argumento stop é um argumento somente externo. Você só deve definir este booleano para YES dentro do bloco.

Então, é claro, eu posso adicionar o seguinte no meu bloco para parar a enumeração:

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

Pelo que pude dizer, não definir explicitamente *stop para YES não tem nenhum efeito colateral negativo. A enumeração parece parar automaticamente no final da matriz. Então está usando *stop realmente necessário em um bloco?

O argumento de stop para o bloco permite que você pare a enumeração prematuramente . É o equivalente a break de um loop for normal. Você pode ignorá-lo se quiser passar por todos os objects da matriz.

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

Esse é um parâmetro out porque é uma referência a uma variável do escopo de chamada. Ele precisa ser definido dentro do seu bloco, mas lido dentro de enumerateObjectsUsingBlock: NSError da mesma forma que os NSError do NSError são normalmente passados ​​de volta para o seu código a partir de chamadas do framework.

 - (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block { // NB: 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; } } }