objective-c cocoa-touch nsarray enumeration fast-enumeration

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 en YES para detener el procesamiento posterior de la matriz. El argumento stop es un argumento out-only. Solo debe establecer este booleano en YES 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; } } }