objective c - ¿Cuál es el argumento BOOL*stop para enumerateObjectsUsingBlock: used for?
objective-c cocoa-touch (1)
He estado usando enumerateObjectsUsingBlock:
mucho últimamente para mis necesidades de enumeración rápida, y me está costando entender el uso de BOOL *stop
en el bloque de enumeración.
Los estados de referencia de la clase NSArray
stop
: una referencia a un valor booleano. El bloque puede establecer el valor enYES
para detener el procesamiento posterior de la matriz. El argumentostop
es un argumento out-only. Solo debe establecer este booleano enYES
dentro del bloque.
Entonces, por supuesto, puedo agregar lo siguiente en mi bloque para detener la enumeración:
if (idx == [myArray indexOfObject:[myArray lastObject]]) {
*stop = YES;
}
Por lo que he podido decir, no establecer explícitamente *stop
en YES
no tiene ningún efecto secundario negativo. La enumeración parece pararse automáticamente al final de la matriz. Entonces, ¿usar *stop
realmente necesario en un bloque?
El argumento stop
en el bloque le permite detener la enumeración prematuramente . Es el equivalente a la break
de un ciclo for
normal. Puede ignorarlo si desea examinar todos los objetos del conjunto.
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];
}];
Ese es un parámetro de salida porque es una referencia a una variable del alcance de la llamada. Debe estar dentro de su Bloque, pero debe leer dentro de enumerateObjectsUsingBlock:
la misma forma en que NSError
s pasa a su código de las llamadas de framework.
- (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;
}
}
}