stop
Block的参数允许您过早停止枚举。这等效break
于普通for
循环。如果要遍历数组中的每个对象,则可以忽略它。
for( id obj in arr ){
if( [obj isContagious] ){
break;
}
if( ![obj isKindOfClass:[Perefrigia class]] ){
continue;
}
[obj immanetizeTheEschaton];
}
[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if( [obj isContagious] ){
*stop = YES;
return;
}
if( ![obj isKindOfClass:[Perefrigia class]] ){
return;
}
[obj immanentizeTheEschaton];
}];
那是一个out参数,因为它是对调用范围中变量的引用。它需要在您的Block内部进行设置,但要在中进行读取enumerateObjectsUsingBlock:
,就像NSError
通常将s从框架调用传递回代码一样。
- (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block {
NSUInteger idx = 0;
for( id obj in self ){
BOOL stop = NO;
block(obj, idx++, &stop);
if( stop ){
break;
}
}
}
stop
标志是建议性的;例如,在并发情况下,枚举可能会继续进行一些不确定的迭代次数。也就是说,您不应__block
在每次通过枚举时无条件地设置变量,并应将其用作stop
用于提前终止的“最后一个”值。您应该始终将“否,使用此对象”与设置结合使用stop = YES;
。