什么是BOOL *停止参数为enumerateObjectsUsingBlock:用于?

我一直在使用enumerateObjectsUsingBlock:最近我需要快速枚举,而且我很难理解BOOL *stop在枚举块中的用法。

NSArray类的引用状态

stop :对布尔值的引用。 该块可以将该值设置为YES以停止进一步处理该数组。 stop参数是一个唯一的参数。 您应该只在块中将此布尔值设置为YES

那么我当然可以在我的块中添加以下内容来停止枚举:

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

从我已经知道,不明确设置*stopYES没有任何消极的副作用。 枚举似乎自动停止在数组的末尾。 那么使用*stop真的有必要在一个块?

块的stop参数允许您提前停止枚举。 这等于从正常for循环中break 。 如果要遍历数组中的每个对象,可以忽略它。

 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参数,因为它是对调用作用域中variables的引用。 它需要在你的Block里面设置,但是在enumerateObjectsUsingBlock:里面读取enumerateObjectsUsingBlock: NSError通常从框架调用传回给你的代码。

 - (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; } } } 
    Interesting Posts