什么是BOOL *停止参数为enumerateObjectsUsingBlock:用于?
我一直在使用enumerateObjectsUsingBlock:
最近我需要快速枚举,而且我很难理解BOOL *stop
在枚举块中的用法。
NSArray
类的引用状态
stop
:对布尔值的引用。 该块可以将该值设置为YES
以停止进一步处理该数组。stop
参数是一个唯一的参数。 您应该只在块中将此布尔值设置为YES
。
那么我当然可以在我的块中添加以下内容来停止枚举:
if (idx == [myArray indexOfObject:[myArray lastObject]]) { *stop = YES; }
从我已经知道,不明确设置*stop
为YES
没有任何消极的副作用。 枚举似乎自动停止在数组的末尾。 那么使用*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; } } }